Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Wybieranie pozycji z odpowiednimi atrybutami.
Forum PHP.pl > Forum > Bazy danych
luis2luis
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') ...



  1. SELECT
  2. SQL_CALC_FOUND_ROWS
  3. *
  4.  
  5. FROM
  6. blog_art a,
  7. blog_art_parametry ap,
  8. blog_art_kat a2c,
  9.  
  10. WHERE
  11. a.zablokuj=0
  12.  
  13. 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
  14.  
  15.  
  16. AND a.art_id = a2c.art_id AND a2c.kat_id IN (8)
  17.  
  18.  
  19. ORDER BY
  20. a.art_id ASC
  21.  
  22. LIMIT
  23. 0,10;


Jak zrobić to, żeby dla kolejnych warunków AND (ap.param_id='11' AND ap.wartosc_id='2') ... AND (ap.param_id='15' AND ap.wartosc_id='2') wyświetlało poprawnąwartość.
Tomplus
Zamiast AND użyj OR między nawiasami:

( AND ) OR ( AND )
luis2luis
Cytat(Tomplus @ 6.12.2019, 15:30:11 ) *
Zamiast AND użyj OR między nawiasami:

( AND ) OR ( AND )


tylko, że wszystkie warunki muszą być spełnione, a nie tak, że jeden albo drugi. Więc takie rozwiązanie odpada.
Tomplus
Może inaczej. Co oznaczają parametry.
Bo może masz źle skonskutrowane zapytanie np. powinieneś użyć INNER JOIN oraz LEFT JOIN.
trueblue
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.
luis2luis
Cytat(Tomplus @ 7.12.2019, 14:46:21 ) *
Może inaczej. Co oznaczają parametry.
Bo może masz źle skonskutrowane zapytanie np. powinieneś użyć INNER JOIN oraz LEFT JOIN.



Mam listę parametrów. Taką jak 1. Obszar, 2 Typ Artykułu. 3 Tematyka. Jest to mechanizm uniwersalny każdy może sobie definiować liste takich parametrów.

blog_params
1 Obszar
2 Typ artykułu
3. Tematyka
...


Teraz mam tabele
blog_art_parametry czyli połączenia
param_id wartosc_id art_id

1 Polska 3
1 Niemcy 5
....

Teraz potrzebuje z listy artykułów blog_art wyświetlić pozycje które dla parametru:
Obszar mają wartość 'Polska' (param_id 1) dla parametru Typ Artykułu (param_id 2) mają '3' i dla Tematyka (param_id 3) mają wartośc 'sportowy'.



nospor
trueblue podal ci poprawne rozwiązanie
luis2luis
Cytat(trueblue @ 7.12.2019, 14:52:36 ) *
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.


Niebardzo rozumnie po co to COUNT, szukam w google zapytań z Group i Count ale tak naprawde nie wiem po co się to stosuje.


fajny przykład znalazłem: https://www.daniweb.com/programming/web-dev...g-php-and-mysql
trueblue
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.