Witam.
Mam pewien problem z wyszukiwarką zaawansowaną, przerabiam istniejące już zapytanie SQL.
Potrzebuje na liście artykułów w danej kategorii wykonać wyszukiwarkę wg parametrów do których jest przypisany artykuł.
Czyli w tabeli blog_art_parametry mam przypisane do danego artykułu parametry.
Następnie z formularza wybieram, że chce dla parametru id 11 wartość X, dla parametry 15 wartość Y.
Jak jest jeden parametr to wyświetla się poprawnie, ale jak jest kilka parametrów i dodaje kolejny warunek to już nie wyświetla nic: AND (ap.param_id='11' AND ap.wartosc_id='4') ...
SELECT SQL_CALC_FOUND_ROWS * FROM blog_art a, blog_art_parametry ap, blog_art_kat a2c, WHERE a.zablokuj=0 AND (ap.param_id='17' AND ap.wartosc_id='1') AND (ap.param_id='11' AND ap.wartosc_id='4') ...... AND ap.art_id = a.art_id AND a.art_id = a2c.art_id AND a2c.kat_id IN (8) ORDER BY a.art_id ASC LIMIT 0,10;
Zamiast AND użyj OR między nawiasami:
( AND ) OR ( AND )
Może inaczej. Co oznaczają parametry.
Bo może masz źle skonskutrowane zapytanie np. powinieneś użyć INNER JOIN oraz LEFT JOIN.
To jeszcze musiałbyś dodać warunek na ilość parametrów. Tu powinno być raczej zapytanie grupujące z COUNT na tą ilość. Jeśli zaznaczyłeś 2 parametry, to COUNT()=2.
trueblue podal ci poprawne rozwiązanie
A ja nie bardzo rozumiem dlaczego nie używasz GROUP BY w swoim zapytaniu. Wiesz, że każdy rekord artykułu zostanie zmultiplikowany tyle razy z iloma cechami zostanie połączony? To ma być wynik wyszukiwania?
Skoro, jak podał Ci Tomplus, używasz teraz OR w klauzuli WHERE, to przy połączeniu z trzema wybranymi cechami rekord zmultiplikuje się maksymalnie trzykrotnie. Ale może mniej. Po to w takim przypadku używasz grupowania (bo nie chcesz w wynikach duplikatów) i po to używasz COUNT=3, żeby wybrać tylko te rekordy artykułów, które "połączyły się" z dokładnie trzema cechami.
P.S. W linku jest właśnie to co opisałem.
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)