SQL jegyzetelés magamnak #1

Amolyan jegyzet magamnak, de hátha másnak is jól jön.

(Adott kategórián belül N elem lekérdezése)

SELECT * 
FROM termekek
	LEFT JOIN kategoriafa AS k USING (katid)
WHERE objid IN (SELECT objid FROM termekek AS o WHERE o.katid = k.katid LIMIT 2)

Thx DeeJayy-nak.

(Tud amúgy valaki valami hasznos olvasmányt haladóbb adatbázissal kapcsolatos dolgokhoz, mind tervezés, mind query faragás témakörén belül?)

Hozzászólások

a limit 2 order by nelkul eleg veszelyes semmi sem garantalja hogy pl egy sql dump-restore utan ugyanaz a ketto lesz a visszateresi ertek.

-- Just my 2 cents.

Ez adatbazis-kezelo specifikus megoldas, nem altalanos SQL. A 'Hasznos SQL keresek' cim felrevezeto lehet masok szamara.

MySQL != SQL (Es hogy tovabb bonyolitsam, a kulonbozo ANSI szabvanyok es azok kompatibilitasi szintjei miatt SQL <> SQL ;) )

Igen, legalábbis nekem ezt a lekérdezést bevette:

SELECT DestinationNumber, SendingDateTime FROM sentitems WHERE ID IN(SELECT ID FROM sentitems WHERE SendingDateTime BETWEEN '2009-01-01' AND '2009-01-10') ORDER BY DestinationNumber;

Más kérdés, hogy lekilleztem, mert iszonyat sokáig futott volna, ugyanis elég nagy adatbázison engedtem el.

MySQL 5.0.32-Debian_7etch1-log
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Ugy jott ide, hogy velelmeztem, h. arrol van szo. Tevedtem.

A dolog pikanteriaja, hogy bar a LIMIT resze a szabvanynak, a legtobb adatbazis-kezelo nem implementalja. Sem az Oracle, sem az MS SQL, sem a DB2 nem igy csinalja, bar termeszetesen tudnak ilyesmit.

Arra celoztam az elozo hozzaszolasommal, h. celszeru indikalni azt, h. milyen adatbazis-kezelore vonatkozik a kerdes, meg abban az esetben is, ha ANSI SQL kod a cel.

Azt hiszem, h. a MySQL 5.1 (?) boldogul az IN predikatumba agyazott allekerdezesekkel. Van aki erre pontosabb valaszt tud adni, mert en elsosorban Oracle teruleten vagyok kepben.

Tulajdonkeppen mit is akarsz csinalni?
Van ket relaciod, amibol az egyik a termekeket irja le, a masik a kategoriakat? A termek relacioban szerepel a kategoria azonositoja egy attributumkent? Ha a kategoriaid mezo azonos mind a ket relacioban, akkor hasznalhatsz termeszetes illesztest, kevesebbet kell gepelni. Ha id alapjan szursz, akkor nem kell belso lekerdezes, ami tovabb noveli a lekerdezes futasi idejet.


SELECT *
FROM termekek, kategoriafa
WHERE kategoriafa.katid = termekek.katid AND
(termekek.katid = ? OR UPPER(kategoriafa.katnev) LIKE UPPER('%?%'))
LIMIT N

? = adott kategoria

Ha jol tippelem a problemat, akkor en igy irnam le... ahogy en elnezem a fent szereplo kod minden kategoriabol ami a kategoriafaban szerepel lekerdez 2 elemet.

A Panem kiadasaban megjelent Adatbazisrendszerek nem olyan rossz valasztas. De ha inkabb HOWTO jellegut szeretnel, akkor talan van valami olyasmi, hogy SQL fejtorok.
---
http://www.aigeruth.hu

Nem, kategóriánként kettő elemet. Arra a fenti SQL kód jó.

Az SQL fejtörőkön gondolkodtam már, valahol olvastam már róla itt. Csak jelenleg a Kiskapu kiadó által kiadott Programtervezési mintákat olvasom. (Az marhajó könyv egyébként. Ha van valami hasonló SQL-hez is - vagy akár OOP-s fejlesztéshez - érdekelne az is.) Bár szerintem nyitok ezeknek egy témát a fórumban majd.

----------------
Lvl86 Troll

(Adott kategórián belül N elem lekérdezése) - engem ez picit felrevezetett.

Mas megoldas hirtelen nem jut eszembe. Valami olyasmit probalnek meg, hogy a termekek tablat a kategoria szerint onmagara illesztem, es kivalasztanam azokat sorokat, ahol nem egyforma a ket termekid, es csak kulonbozo katid-val rendelkezo sorokat valasztanek ki, es ezekbol csak egyet. Ekkor a belso lekerdezes meg mindig kiesik. Persze a kapott informaciot feldolgozni kicsit macerasabb, mivel parban jonnek ki kategoriankent az adatok. Kerdes, hogy mennyire sebessegkritikus a dolog.
---
http://www.aigeruth.hu