Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Ułożenie zapytanie z JOIN
Forum PHP.pl > Forum > Przedszkole
kamilos12
Witam,
załóżmy że mam dwie tabelki:

ZDJĘCIA
- id
- nazwa
- opis
- autor

EFEKTY
- id
- id_zdjecia
- efekt

I chciałbym wyświetlić jedno zdjęcie oraz wszystkie efekty (może ich być np. 5) W jaki sposób ułożyć zapytanie? Bo dostaje tylko jeden efekt.

Z góry dzięki za pomoc.
nospor
No a jakie ty masz zapytanie?
kamilos12
W przybliżeniu:

  1. $this->db->query("SELECT * FROM " . DB_PREFIX . "zdjecia AS zdjecia LEFT JOIN " . DB_PREFIX . "efekty AS efekty ON zdjecia.id = efekty.zdjecie_id WHERE zdjecie.id = '{$id}'");

nospor
No i zapytanie jest ok. Widac zle odbierasz dane, skoro dostajesz tylko jeden rekord. To zapytnie zwraca tyle rekordow ile masz efektow dla danego zdjecia
kamilos12
No tak, jak wrzucę w pętle to dostaje więcej, ale jak to teraz obrobić? Nie da się zrobić tak żeby efekty były w dodatkowej tablicy??
nospor
Jak chcesz efekty wydzielic do oddzielnej tablicy to nie ma bata, musisz to zrobic sam w php smile.gif
kamilos12
No chyba tak, bo np. chcąc dostać nazwę zdjęcia muszę odwołać się do zerowego elementu: $zdjecie[0]['nazwa'] itd.
Muszę chyba jakiś paser do tego napisać.

Dzięki za pomoc wink.gif
phpion
Albo rozbić to na 2 zapytania: 1 do pobrania informacji o zdjęciu, 2 do pobrania informacji o efektach. Mniejsza ilość zapytań nie zawsze jest lepsza. Przykładowo tutaj w wyniku otrzymasz nadmiarowość danych: zdublowane dane dotyczące zdjęcia. Dla kilku rekordów może nie jest to nic strasznego, ale dla większych zbiorów różnica może być wyraźnie odczuwalna. Ja bym to ciachnął 2 zapytaniami.
nospor
Cytat
No chyba tak, bo np. chcąc dostać nazwę zdjęcia muszę odwołać się do zerowego elementu: $zdjecie[0]['nazwa'] itd.

Kazdy rekord zawiera nazwe zdjecia a nie tylko pierwszy.
Rekordy roznią sie tylko efektami.

Cytat
Albo rozbić to na 2 zapytania: 1 do pobrania informacji o zdjęciu, 2 do pobrania informacji o efektach. Mniejsza ilość zapytań nie zawsze jest lepsza. Przykładowo tutaj w wyniku otrzymasz nadmiarowość danych: zdublowane dane dotyczące zdjęcia. Dla kilku rekordów może nie jest to nic strasznego, ale dla większych zbiorów różnica może być wyraźnie odczuwalna. Ja bym to ciachnął 2 zapytaniami.
Nie widze sensu tutaj dwoch zapytan, ktore bedą i tak wolniejsze od tego jednego.
A jesli tak bardzo boli nadmiarowosc danych, to mozna przeciez uzyc GROUP BY oraz GROUP_CONCAT a wowczas wszystkie efekty i zdjecie będą w jednym rekordzie.
kamilos12
Dobra, to mam jeszcze jeden problem. Będę chciał wyświetlić 100 zdjęć i każde ma od 3 do 6 efektów i jak to udźwignąć? Bo w ten sposób będę miał zwrócone 100 * (3,6) tablic?
nospor
http://nospor.pl/grupowanie-wynikow.html

Masz tam tez przyklad z GROUP BY. Tak wiec do wyboru do koloru smile.gif
kamilos12
Okej, dzięki przyglądnę się temu. A miałbyś czas napisać samego sql do tego przykładu? Bo jednak na swoim kodzie człowiek szybciej łapie.
nospor
Sql przeciez juz masz.... wystarczy ze wywalisz WHERE, ktore ogranicza cie tylko do jednego zdjecia.
kamilos12
Nie działa mi to za bardzo :/
nospor
Jak chcesz pomocy, to pisz pelnymi zdaniami. "Nie dziala" to mowią dzieci w zlobki a nie programisci
kamilos12
No okej, nie rozumiem po prostu niektórych rzeczy w tym zapytaniu, nie stosujesz nigdzie Aliasów typu p a do nich się odwołujesz, popraw mnie jak się mylę.
nospor
Jak to nie definiuje aliasu p.....
A to:
left join product p
to niby co to jest? Czytasz w ogole co tam jest napisane czy tylko czekasz az zrobie to za ciebie?
kamilos12
Okej, no tak, chodź użycie AS byłoby bardziej czytelne. Z punktu optymalizacji to lepiej skorzystać z group() czy obrobić to w php?
nospor
Cytat
chodź użycie AS byłoby bardziej czytelne
Czytanie a nie udawanie ze sie czyta tez byloby o wiele czytelniejsze... Masz tam prosty, krotki sql i masz problem ze znalezieniem aliasu P. To naprawde nie jest spowodowane brakiem AS.

Cytat
Z punktu optymalizacji to lepiej skorzystać z group() czy obrobić to w php?
Nie wiem. Ja osobiscie rzadko kiedy korzystam z GROUP w takich sytuacjach
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.