Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyszukiwanie i relacja jeden do wielu
kozik_wnb
post 4.07.2012, 10:15:20
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.10.2009

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


Witam, piszę w pewnym problemem z którym długo się męczę i w końcu się poddałem.
Mianowicie chodzi o zapytanie do dwóch tabel podczas wyszukiwania rekordów.
Mam dwie tabele:

- ogloszenia( advert_id | title | content )
- cechy_ogloszen ( id | advert_id | cecha_id )

Każde ogłoszenie może mieć kilka cech (relacja advert_id) i teraz chciałbym wyszukać tylko takie ogłoszenia które mają cechy np. 1 i 2 (ogłoszenie musi mieć te dwie cechy, może mieć więcej byleby miał te dwie wskazane).

Proszę o pomoc, pozdrawiam
Go to the top of the page
+Quote Post
Sephirus
post 4.07.2012, 10:28:46
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Najprościej (co nie oznacza najlepiej) można to ogarnąć tak:

  1. SELECT DISTINCT o.* FROM ogloszenia o
  2. LEFT JOIN cechy_ogloszen c1 ON c1.advert_id = o.advert_id AND c1.cecha_id = 1
  3. LEFT JOIN cechy_ogloszen c2 ON c2.advert_id = o.advert_id AND c2.cecha_id = 2
  4. WHERE c1.advert_id IS NOT NULL AND c2.advert_id IS NOT NULL


To zadziała dla dwóch spokojnie - ale już dla trzeciej musisz dodać kolejnego joina... i warunek w WHERE... więc to nie jest uniwersalne rozwiązanie ale w miare szybkie

Możesz też użyć opcji z podzapytaniem (wtedy jest uniwersalne choć mniej wydajne)

  1. SELECT o.* FROM ogloszenia o WHERE (SELECT COUNT(*) FROM cechy_ogloszen WHERE cecha_id IN(1,2) AND advert_id = o.advert_id) = 2


Ostatecznie możesz kombinować z GROUP_CONCAT na przykład tak:

  1. SELECT o.*, GROUP_CONCAT(DISTINCT c.cecha_id ORDER BY c.cecha_id ASC) AS cechy FROM ogloszenia o
  2. LEFT JOIN cechy_ogloszen c ON c.advert_id = o.advert_id AND c.cecha_id IN (1,2)
  3. GROUP BY o.advert_id HAVING cechy = '1,2'


Do wyboru, do koloru wink.gif


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
kozik_wnb
post 4.07.2012, 11:03:12
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.10.2009

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


Super! Pomogło!:-) Dzięki wielkie:-)
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: 21.06.2025 - 09:23