SQL-ben lekérdezni azokat a sorokat egy táblából, amik azonosítója nem szerepel egy másikban?
Adott 2 táblám:
TERMEKEK
--------
azonosito: auto incr. int
nev: tinytext
ar: int
FORGALOMBAN
-----------
azonosito: auto incr. int
termek_azonosito: int (ez a kapcsolat a másik táblával)
...
az ok, hogy hogy kérdezem le az összes terméket:
SELECT * FROM TERMEKEK;
az is ok, hogy hogyan kérdezem le azt a terméket, ami a FORGALOMBAN táblában is szerepel:
SELECT * FROM TERMEKEK, FORGALOMBAN WHERE TERMEKEK.azonosito = FORGALOMBAN.termek_azonosito;
Na de hogyan kérdezem le azokat, amik NEM szerepelnek a FORGALOMBAN adattáblában?
Arra gondoltam, hogy lekérdezem a forgalomba hozottakat, és PHP-ben kiszűrögetem, de szeretném simán SQL-ben megoldani, hogy használhassak LIMIT-et a lekérdezésben.
bocsánat,kis elgépelés,meg én ID-t szoktam használni..
SELECT * FROM TERMEKEK WHERE TERMEKEK.azonosito NOT IN (SELECT azonosito FROM FORGALOMBAN );
A not in... megoldás logikailag egyszerű, de borzasztóan lassú tud lenni. Ennél általában sokkal gyorsabb a halmazelméleti különbség alkalmazása:
SELECT * FROM termekek WHERE azonosito IN
(SELECT azonosito FROM termekek
EXCEPT
SELECT termek_azonosito FROM forgalomban)
Ha csak az azonosítók kellenek, elég a zárójeles rész.
Egy tanács: csak az SQL alapszavakat írd nagybetűkkel, így szokás, sokkal olvashatóbb lesz tőle a kód.
"az is ok, hogy hogyan kérdezem le azt a terméket, ami a FORGALOMBAN táblában is szerepel:
SELECT * FROM TERMEKEK, FORGALOMBAN WHERE TERMEKEK.azonosito = FORGALOMBAN.termek_azonosito;"
A kérdésedre a választ már megirták, én csak annyit tennék hozzá, hogy már ez sem jó, amit ide irtál.
Továbbá, nem értem, miért kell egy külön táblában tárolni azt, hogy forgalomban van-e, ez sebesség szempontjából a lehető legrosszabb megoldás, miért nem a termekek táblába raksz egy forgalomban nevü bool mezőt, ami true, ha forgalomban van az adott termék, és false, ha ha nincs forgalomban?
Tényleg csak segitségképpen irom, de nézz utána a normálformáknak, mielőtt DB-t tervezel, nem nehéz megérteni, nem is hosszú, viszont nem lehet nélküle normális DB-t tervezni..
Kezdetnek egyelőre elég, ha a 3. normálformáig elsajátitod a dolgokat.
Köszönöm szépen a válaszokat, sikerült!
Én osztottam a plusszokat rendesen! :)
Köszi még egyszer!
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!