kamilos12
21.01.2014, 14:10:49
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
21.01.2014, 14:12:28
No a jakie ty masz zapytanie?
kamilos12
21.01.2014, 14:32:35
W przybliżeniu:$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
21.01.2014, 14:34:38
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
21.01.2014, 14:38:33
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
21.01.2014, 14:40:25
Jak chcesz efekty wydzielic do oddzielnej tablicy to nie ma bata, musisz to zrobic sam w php
kamilos12
21.01.2014, 14:42:15
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
phpion
21.01.2014, 14:44:25
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
21.01.2014, 14:46:43
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
21.01.2014, 14:48:00
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
21.01.2014, 14:51:31
http://nospor.pl/grupowanie-wynikow.htmlMasz tam tez przyklad z GROUP BY. Tak wiec do wyboru do koloru
kamilos12
21.01.2014, 14:55:50
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
21.01.2014, 14:59:03
Sql przeciez juz masz.... wystarczy ze wywalisz WHERE, ktore ogranicza cie tylko do jednego zdjecia.
kamilos12
21.01.2014, 15:07:49
Nie działa mi to za bardzo :/
nospor
21.01.2014, 15:17:27
Jak chcesz pomocy, to pisz pelnymi zdaniami. "Nie dziala" to mowią dzieci w zlobki a nie programisci
kamilos12
21.01.2014, 15:19:39
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
21.01.2014, 15:21:51
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
21.01.2014, 15:26:44
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
21.01.2014, 15:32:53
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.