ugrás a tartalomhoz

Azon rekordok lekérdezése, amihez nem kapcsolódik másik táblában rekord

Marcell · 2007. Május. 5. (Szo), 15.20
Sziasztok!

A kérdésem sztem egyszerű, de nem jövök rá, hogyan oldjam meg. Adott két egyszerű tábla:
CREATE TABLE IF NOT EXISTS cimkek (
	id SMALLINT UNSIGNED NOT NULL auto_increment,
	nev VARCHAR(50) NOT NULL default '',
	PRIMARY KEY (id)
);

CREATE TABLE IF NOT EXISTS cimkezes (
	elem_id INT UNSIGNED NOT NULL,
	kategoria ENUM ('blog', 'galeria'),
	cimke_id SMALLINT UNSIGNED NOT NULL
);
A cimkeze tábla köti össze a címkéket a bejegyzéseket. A cimkek táblából szeretném kilistázni azokat a sorokat, amikhez nem kapcsolódik semmi a cimkezes táblában az adott bejegyzéssel. Tehát ha épp a galéria 5 id-vel rendelkező elemét szerkeszti, akkor listázza ki azokat a címkéket, amik még nincsenek hozzáadva az 5-ös galériához.

Valami JOIN-nal kéne gondolom.. Próbáltam EXCEPT-el is, de a legegyszerűbb lekérdezés sem futott le nálam (verzióföggő?)..
 
1

Egy megoldás

vbence · 2007. Május. 5. (Szo), 16.06
select cimkek.id, cimkek.nev, cimkezes.cimke_id
from cimkek left join cimkezes on cimkezes.cimke_id=cimkek.id
    and cimkezes.kategoria='galeria' and cimkezes.elem_id=5
having cimke_id is null
Nem vagyok igazán SQL guru, úgyhogy biztos lesz szebb megoldás is...
2

köszi

Marcell · 2007. Május. 5. (Szo), 16.32
Ezek szerint azt szúrtam el, hogy a feltételeket már csatlakoztatásnál meg kell adni (én később adtam meg WHERE kritériumként). Annyit változtattam még rajta, hogy a NULL-os feltételt átraktam HAVING-ből WHERE-be, így már nem kell lekérdezni az amúgy érdektelen cimke_id oszlopot.
SELECT
	cimkek.id, cimkek.nev
	
	FROM cimkek
		LEFT JOIN cimkezes ON cimkezes.cimke_id = cimkek.id AND cimkezes.kategoria = 'galeria' AND cimkezes.elem_id = 5
	
	WHERE cimkezes.cimke_id IS NULL
	
	ORDER BY cimkek.nev
Köszönöm a gyors segítséget!
6

having - group by

Hodicska Gergely · 2007. Május. 6. (V), 21.31
Szia!


A left join mint otlet teljesen jo, a teljesitmenye is jobb lesz, mint az in/subselect parosnak. Viszont having klauzulanak csak group by hasznalata eseten van ertelme.


Udv,
Felho
3

Másik

Darkfish · 2007. Május. 5. (Szo), 18.45
select cimkek.id, cimkek.nev, cimkezes.cimke_id from cimkek
where not cimkek.id in (select cimkezes.cimke_id from cimkezes where cimkezes.cimke_id=cimkek.id and cimkezes.kategoria='galeria' and cimkezes.elem_id=5)


De hogy ez működik-e mysql-ben azt nem tudom.
4

nekem is!

TIV · 2007. Május. 6. (V), 11.29
nekem is lenne egy kérdésem...van egy querym amiben in van és nem akar egy mysql4 es szerveren működni. hogy lehetne megkerülni?

SELECT felh FROM felhasznalok WHERE cim in (SELECT cime FROM valaszok WHERE valasz='3')

köszönöm!
ui: a DISTINCT menni fog a régebbi mysqlon?
5

nem az in miatt...

Sulik Szabolcs · 2007. Május. 6. (V), 20.58
... hanem a beágyazott sql lehet az oka. 4.0 mysql-ben nem fog menni, csak 4.1-től.