Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] many-to-many - pobieranie wyników
Forum PHP.pl > Forum > Bazy danych
zdzichu
Witajcie.
Załóżmy, że mam 3 tabele:
photos ( id,name)
tags (id,name)
i photo_tags (photo_id,tag_id)

photos i tag są połączone relacją wiele do wielu.
Teraz 2 pytania:
1. załóżmy, że chcę pobrać wszystkie zdjęcia, które są otagowane (jednocześnie) przez tagi foo i bar. Jak to wykonać za pomocą jednego zapytania?(i czy lepiej to mieć w jednym zapytaniu, czy może lepiej to rozbić na kilka selectów i przemielić w php) ?
2. Załóżmy, że mam zdjęcie o id= 5. Chciałbym pobrać zdjęcie, które ma podobne* tagi do tego zdjęcia

*tak naprawdę, to sam nie do końca jestem przekonany co oznacza podobne - czy dokładnie takie same, czy np. 80% tagów takich samych - tu bym prosił o radę, w jaki sposób uznać, czy zdjęcie jest podobne czy nie....
Z góry dzięki za odpowiedzi
erix
Cytat
1. załóżmy, że chcę pobrać wszystkie zdjęcia, które są otagowane (jednocześnie) przez tagi foo i bar. Jak to wykonać za pomocą jednego zapytania?(i czy lepiej to mieć w jednym zapytaniu, czy może lepiej to rozbić na kilka selectów i przemielić w php) ?

JOIN + WHERE

Cytat
2. Załóżmy, że mam zdjęcie o id= 5. Chciałbym pobrać zdjęcie, które ma podobne* tagi do tego zdjęcia

Hmm, możesz pozajeżdżać bazę w ten sposób... Jest w MySQL funkcja obliczająca podobieństwo fraz, ale na dłuższą metę to zajeździ bazę...
thomas2411
1. Poczytaj o JOIN
2. Moim zdaniem lepiej dodawać więcej tagów do zdjęć, aby jak najlepiej je opisać, a podobne tagi określać jako takie, że przynajmniej jeden tag się zgadza.
zdzichu
ok, więc do do pierwszego, mam coś takiego:
  1. SELECT photos.name FROM photos LEFT JOIN (photo_tags,photo_tags_photos) ON (photo_tags_photos.photo_id=photos.id AND photo_tags_photos.photo_tag_id = photo_tags.id) WHERE photo_tags.name = "foo"

i przy jednym tagu działa ok, jednak jak przyłączyć takie, które mają jednocześnie dwa tagi? dodanie AND photo_tags.name="bar" nie działa(bo i nie ma sensu)
co do drugiego:
zastanawiałem się nad takim rozwiązaniem: pobieram np. 80% tagów danego zdjęcia (to robię przez php) - i szukam innych zdjęć, które mają wszystkie te 80% tagów takich samych. jeśli nie ma, to szukam takie, które mają wspólne 60% tagów - i tak do momentu, aż nie znajdę np. 5 podobnych zdjęć. rozbije się to na (w wariancie pesymistycznym) kilka zapytań, ale w sumie nie będzie tam zasobożernych funkcji..
erix
Cytat
i przy jednym tagu działa ok, jednak jak przyłączyć takie, które mają jednocześnie dwa tagi? dodanie AND photo_tags.name="bar" nie działa(bo i nie ma sensu)

Wystarczy chyba tylko jedno dowiązanie przy JOIN.

Cytat
zastanawiałem się nad takim rozwiązaniem: pobieram np. 80% tagów danego zdjęcia (to robię przez php) - i szukam innych zdjęć, które mają wszystkie te 80% tagów takich samych. jeśli nie ma, to szukam takie, które mają wspólne 60% tagów - i tak do momentu, aż nie znajdę np. 5 podobnych zdjęć. rozbije się to na (w wariancie pesymistycznym) kilka zapytań, ale w sumie nie będzie tam zasobożernych funkcji..

Zawsze pozostaje tabela opisująca pokrewne tagi.
Crozin
Cytat
i przy jednym tagu działa ok, jednak jak przyłączyć takie, które mają jednocześnie dwa tagi? dodanie AND photo_tags.name="bar" nie działa(bo i nie ma sensu)
No bo powinieneś użyć IN, ewentualnie OR.
zdzichu
...prosiłbym bardzo o pomoc przy tym joinie. mam takie zapytanie:
  1. SELECT photos.id AS photo_id, photos.name,photo_tags.name AS tag,photo_tags.id AS tag_id FROM photos LEFT JOIN (photo_tags,photo_tags_photos) ON (photo_tags_photos.photo_id=photos.id AND photo_tags_photos.photo_tag_id = photo_tags.id) WHERE photo_tags.name IN ('foo','bar')

i otrzymuję w wyniku coś takiego:
Kod
photo_id     name     tag     tag_id
7    asd.jpeg    foo    5
8    dsa.jpeg    foo    5
8    dsa.jpeg    bar    6
9    ttt.jpeg                bar    6

ogólnie wiem, że ten IN() nie ma sensu w moim przypadku, użyłem go tylko, żeby pokazać jak wyglądają dane w mojej bazie. chciałbym pobrać zdjęcie, które ma tagi foo i bar - czyli w moim przypadku dsa.jpeg (i tylko te)
z góry dzięki za wszelką pomoc winksmiley.jpg
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.