Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [sql] many-to-many - pobieranie wyników
zdzichu
post
Post #1





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 28.08.2006

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


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
Go to the top of the page
+Quote Post
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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ę...
Go to the top of the page
+Quote Post
thomas2411
post
Post #3





Grupa: Zarejestrowani
Postów: 108
Pomógł: 7
Dołączył: 15.05.2005
Skąd: Rzeszów

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


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.
Go to the top of the page
+Quote Post
zdzichu
post
Post #4





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 28.08.2006

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


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..
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
zdzichu
post
Post #7





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 28.08.2006

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


...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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 13:55