Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] pobieranie danych z bazy w relacji wiele do wielu
Forum PHP.pl > Forum > Bazy danych > MySQL
sieradz
Mam problem z którym nie mogę sobie poradzić.

Posiadam 3 tabele [relacja wiele do wielu]:

  1. CREATE TABLE `tag` (
  2. `tag_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) NOT NULL,
  4. PRIMARY KEY (`tag_id`),
  5. UNIQUE KEY `name` (`name`)
  6. );
  7.  
  8. CREATE TABLE `tagmap` (
  9. `id` int(11) NOT NULL AUTO_INCREMENT,
  10. `video_id` int(11) NOT NULL,
  11. `tag_id` int(11) NOT NULL,
  12. PRIMARY KEY (`id`)
  13. );
  14.  
  15.  
  16. CREATE TABLE `artykul` (
  17. `id` int(11) NOT NULL AUTO_INCREMENT,
  18. `link` varchar(245) NOT NULL,
  19. `data` date NOT NULL,
  20. `tytul` varchar(245) NOT NULL,
  21. PRIMARY KEY (`id`)
  22. );


Tagmap to tabela łącząca tabele artykul i tag. Chciałbym tak połączyć 3 tabele i wyświetlić te rekordy, które posiadają okreslone przeze mnie wartosci w tabeli tag. Czyli chciałbym pobrać te artykuły, które posiadają okreslone przeze mnie tagi - dokladnie dwa - nie wiecej i nie mniej. Czyli podaje np. tagi "test1" i "test2" i otrzymuje artykuły posiadające te tagi ale tylko te które posiadają te dwa tagi a nie jeden. Zrobiłem takie coś ale to wlasnie pobiera artykul albo z jednym albo drugim tagem albo z dwoma:

  1. $tags = '
  2. SELECT *
  3. FROM tagmap vt, video v, tag t
  4. WHERE vt.tag_id = t.tag_id
  5. AND (t.name IN (\''.$tag_name.'\'))
  6. AND v.id = vt.video_id
  7. GROUP BY v.id';


$tag_name to zmienna z tagami rozdzielonymi ','

Orientuje sie może ktoś jak ugryżć ten temat?
nospor
Problem z PHP nie ma zadnego zwiazku... Zwracaj prosze uwage gdzie piszesz. Przenosze.

Zamiast wszystkich tabel we FROM daj tam tylko tabele z artykulem.
Reszte tabel JOINuj. I masz JOINowac tyle razy ile szukasz tagow

ps: no i uzywaj BBCODE

ps: ID w tabeli tagmap jest raczej zbedne. Zas z pozostalych dwoch kolumn w tej tabeli powinienies utworzyc klucz glowny
mmmmmmm
  1. SELECT video_id FROM tagmap vt JOIN tag t ON vt.tag_id = t.tag_id AND t.name IN ($tag_name) GROUP BY video_id HAVING COUNT(ISTINCT t.tag_id)=2**

** - w tym miejscu pojaiwa się liczność $tag_name
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.