Problem można rozwiązać na trzy sposoby, pierwszy podał tolomei (użycie NOT EXISTS):
SELECT `p`.`id` FROM `produkty` `p` WHERE NOT EXISTS (SELECT `w`.`id_produkty` FROM `wybrane` `w` WHERE `p`.`id` = `w`.`id_produkty` AND `w`.`user` = 2);
Drugi sposób to ten, o którym wspomniał phpion (zastosowanie LEFT JOIN / IS NULL):
SELECT `p`.`id`, `p`.`nazwa` FROM `produkty` `p` LEFT JOIN `wybrane` `w` ON (`w`.`id_produkty` = `p`.`id` AND `w`.`user` = 2) WHERE `w`.`id` IS NULL
Można jeszcze użyć NOT IN:
SELECT `p`.`id`, `p`.`nazwa` FROM `produkty` `p` WHERE `p`.`id` NOT IN (SELECT `w`.`id_produkty` FROM `wybrane` `w` WHERE `w`.`user` = 2)
Okazuje się, że zapytanie wykorzystujące NOT EXISTS jest najwolniejsze z tych trzech aż o ok. 30%, natomiast wydajność dwóch pozostałych zapytań jest porównywalna. Dlatego przy większej liczbie produktów radziłbym użyć albo zapytania z LEFT JOIN / IS NULL, albo zapytania z NOT IN.
Odsyłam do
źródła.
EDITCytat
wartosc null ? w sumie mozna ale to trzeba dodatkowo w php obrabiac, chce to zrobic jak najkrócej
Nic nie trzeba obrabiać po stronie PHP, jeśli wykorzystamy zapytanie z LEFT JOIN / IS NULL, bo te rekordy z pustą wartością nie będą uwzględnione.