Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie i relacja jeden do wielu
Forum PHP.pl > Forum > Bazy danych > MySQL
kozik_wnb
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
Sephirus
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
kozik_wnb
Super! Pomogło!:-) Dzięki wielkie:-)
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-2025 Invision Power Services, Inc.