Wyglada to mniej wiecej tak w duzym skrocie:
tabela: hardware
HardID 1
HardID 2
HardID 3
tabela: software
SoftID 10
SoftID 11
SoftID 12
tabele: cthardtosoft
HardID 1; SoftID 10
HardID 1; SoftID 11
HardID 1; SoftID 12
HardID 2; SoftID 10
HardID 2; SoftID 11
HardID 3; SoftID 10
Zapytanie w postaci listy wszystkich komputerow ktore POSIADAJA jakis soft to prosta sprawa. Ale mam klopot z odwrotna sytujacja. Chce liste komputerow ktore np. NIE POSIADAJA softu o ID 12
Probowalem w taki sposob ale mam przeklamane dane:
SELECT h.*, count(hs.HardID) AS liczba FROM hardware AS h LEFT JOIN cthardtosoft AS hs ON (h.HardID = hs.HardID) WHERE h.HardID IS NULL OR hs.SoftID != '12' GROUP BY hs.HardID HAVING liczba <= 1
lub tak:
SELECT * FROM hardware WHERE HardID IN ( SELECT HardID FROM cthardtosoft WHERE SoftID != '12' GROUP BY HardID HAVING count(*) <= 1 )
Jezeli mam wybierac to wolalbym jedno zapytanie, bez podzapytan.
Mam do dyspozycji MySQL 4.1