Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql] Wybieranie pozycji z odpowiednimi atrybutami., Wyszukiwarka zaawansowana
luis2luis
post 6.12.2019, 14:17:59
Post #1





Grupa: Zarejestrowani
Postów: 108
Pomógł: 0
Dołączył: 25.11.2015

Ostrzeżenie: (0%)
-----


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ść.
Go to the top of the page
+Quote Post
Tomplus
post 6.12.2019, 15:30:11
Post #2





Grupa: Zarejestrowani
Postów: 1 581
Pomógł: 188
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Zamiast AND użyj OR między nawiasami:

( AND ) OR ( AND )
Go to the top of the page
+Quote Post
luis2luis
post 7.12.2019, 14:38:10
Post #3





Grupa: Zarejestrowani
Postów: 108
Pomógł: 0
Dołączył: 25.11.2015

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Tomplus
post 7.12.2019, 14:46:21
Post #4





Grupa: Zarejestrowani
Postów: 1 581
Pomógł: 188
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Może inaczej. Co oznaczają parametry.
Bo może masz źle skonskutrowane zapytanie np. powinieneś użyć INNER JOIN oraz LEFT JOIN.
Go to the top of the page
+Quote Post
trueblue
post 7.12.2019, 14:52:36
Post #5





Grupa: Zarejestrowani
Postów: 5 656
Pomógł: 1547
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
luis2luis
post 7.12.2019, 16:11:53
Post #6





Grupa: Zarejestrowani
Postów: 108
Pomógł: 0
Dołączył: 25.11.2015

Ostrzeżenie: (0%)
-----


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'.



Go to the top of the page
+Quote Post
nospor
post 7.12.2019, 20:32:57
Post #7





Grupa: Moderatorzy
Postów: 34 987
Pomógł: 5842
Dołączył: 27.12.2004




trueblue podal ci poprawne rozwiązanie


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
luis2luis
post 8.12.2019, 22:16:41
Post #8





Grupa: Zarejestrowani
Postów: 108
Pomógł: 0
Dołączył: 25.11.2015

Ostrzeżenie: (0%)
-----


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

Ten post edytował luis2luis 8.12.2019, 23:15:23
Go to the top of the page
+Quote Post
trueblue
post 9.12.2019, 08:24:05
Post #9





Grupa: Zarejestrowani
Postów: 5 656
Pomógł: 1547
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 22.01.2020 - 09:22