Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie trzech tabel i wyszukiwanie kilku tagów
Forum PHP.pl > Forum > Bazy danych > MySQL
ziomal22
Witam, próbuję jakoś w miarę zgrabnie zapytać bazę o taką sprawę.

Załóżmy że mam 3 tabele: posts, tags i posts_tags.
- posts ma kolumny id oraz title
- tags ma kolumny id oraz tag
- posts_tags ma kolumny post_id oraz tag_id

Jeden post może mieć przypisanych wiele tagów. Chcę wyszukać posty, które są oznaczone danymi tagami. Problem w tym, że chcę wyszukiwać pod kątem kilku tagów na raz, tzn. np szukam posta który ma jednocześnie tag "aktualności" i "święta" (tongue.gif).

Wymodziłem coś takiego:

  1. SELECT `posts`.`id`, `title` FROM `posts` JOIN `posts_tags` ON `posts`.`id` = `posts_tags`.`post_id` JOIN `tags` ON `posts_tags`.`tag_id` = `tags`.`id` WHERE `tag` = 'aktualnosci' AND `tag` = 'swieta' GROUP BY posts.id ORDER BY `date` DESC


To działa dla wyszukiwania jednego tagu, ale gdy chcę wyszukać dwa (jak powyżej), to zwróci pusty wynik. Nie mam pomysłu jak zrobić takie wyszukiwanie, chociaż problem wydaje się być oklepany. Próbowałem GROUP_CONCAT + HAVING LIKE - taki potworek by nawet działał, ale to raczej mało poprawne.

Z góry dziękuję za wszelką pomoc :-)
nevt
nie
  1. ... WHERE `tag` = 'aktualnosci' AND `tag` = 'swieta' ...

tylko
  1. ... WHERE `tag` = 'aktualnosci' OR `tag` = 'swieta' ...
ziomal22
Taki wariant też próbowałem, niestety pokaże on również posty które mają tylko jeden z tych tagów. A mi zależy na obu. Jak to odfiltrować?
nevt
Kod
SELECT p.id, p.title FROM posts p
LEFT JOIN post_tags pt ON p.id = post_id
LEFT JOIN tags t ON tag_id = t.id  
WHERE (tag = 'aktualnosci' OR tag = 'swieta')
GROUP BY p.id HAVING COUNT(t.id) = 2;


sorry za znacznik [ code ] ale durny znacznik [ sql ] nie pozwala złamać wiersza i długich zapytań nie da się czytać...
ziomal22
Działa! Po stokroć dzięki! :-)
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.