Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] pobieranie danych z bazy w relacji wiele do wielu
sieradz
post 24.04.2014, 14:51:41
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 1.03.2011

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


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?

Ten post edytował sieradz 24.04.2014, 15:05:20
Go to the top of the page
+Quote Post
nospor
post 24.04.2014, 15:16:19
Post #2





Grupa: Moderatorzy
Postów: 36 556
Pomógł: 6314
Dołączył: 27.12.2004




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


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

"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
mmmmmmm
post 24.04.2014, 23:00:23
Post #3





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  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

Ten post edytował mmmmmmm 24.04.2014, 23:01:10
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: 2.05.2025 - 05:13