Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pomysl na pobieranie wielu danych
Forum PHP.pl > Forum > PHP
quality
Witam
Mysle jak dobrze zorganizowac pobieranie wielu danych. Moze pytanie nie nalezy do najbardziej wymagajacych, jednak zastanawiam sie ktory sposob jest szybszy i latwiejszy w pozniejszym renderowaniu na stronie. Zalezy mi na jakosci programu i kodu smile.gif.
Podaje przyklad mamy liste sond, kazda ma po kilka pytan.

Jak najlepiej pobrac dane z bazy ?

1. Pierwsze co sie nasuwa to zeby pobrac najpierw same sondy, a pozniej w osobnym zapytaniu odpowiedzi do kazdej znich umiescic w innej tabeli.
Jest to rozwiazanie ktore do tej pory stosowalem, jednak nie jestem pewien czy jest najlepsze.

2. Pobierac wszystko jednym zapytaniem uzywajac LEFT JOIN, wtedy nie mamy dwoch zapytan tylko jedno. Niestety robi sie powtarzanie danych samej sondy, no i pozniej trzeba sie troche nakombinowac przy odpowiednim wyswietleniu.

Ktorego sposobu uzywacie ? Macie jakis za i przeciw ? smile.gif A moze ktos obral inny sposob.

Dzieki za informacje i pozdrawiam
nospor
oczywiscie ze sposob 2.
W pierwszym sposobie wykonujesz x zapytan - malo optymalne.

No i nie wiem gdzie ty widzisz problem w drugim sposobie? Trzeba sie nakombinowac by pobrac? Bez jaj...winksmiley.jpg
zzeus
Proponuje skorzystać z LEFT JOIN oraz GROUP_CONCAT, wtedy masz jedno zapytanie i nie powtarzają się dane sondy smile.gif
quality
Hmmm bardzo ciekawe mozecie podac jakis przyklad zapytania ?

Moze zylem w blogiej nieswiadomosci biggrin.gif

nospor hmmm no stadardowo sa powtarzane dane z samych sond i listujac trzeba rozpoznac kiedy zaczyna sie nastepnasonda. W sposobie zzeus widze ze ten problem nie istnieje, jednak explode danych pozniej hmmm sam nie wiem.


Hmmm znalazlem takiecos

  1.  
  2. SELECT entries.*, channels.channel_name AS chname,
  3. GROUP_CONCAT(channels.channel_name) AS channel_names
  4. FROM entry_channel
  5. INNER JOIN entries ON entry_channel.entry_id = entries.entry_id
  6. INNER JOIN channels ON entry_channel.channel_id = channels.channel_id
  7. GROUP BY entry_channel.entry_id
  8. HAVING chname = 'krzaki'
  9. ORDER BY entries.created_at DESC
  10. LIMIT 25
  11.  


Powiedzcie wynik w kolumnie "channel_names" gdzie zastosowalem GROUP_CONCAT, bedzie oddzielony przecinkiem ? Trzeba robic explode czy jakos inaczej to jest zrobione. Jeszcze nie zdazylem przetestowac biggrin.gif
nospor
jesli pytasz o GROUP_CONCAT to przyklad "jakiegos" zapytania masz w manualu:
http://dev.mysql.com/doc/refman/5.0/en/gro...on_group-concat

Ja osobiscie nie korzystam z tej metody. zwykly left join bez grupowania. Potem w php bez problemu pobiera sie dane
quality
No dobrze ale pobierajac tak dane wystepuje nadmiarowosc danych. Podam przyklad:
  1. id | nazwa_sondy | odpowiedz
  2.  
  3. 1 | nazwa | odpowiedz 1
  4. 1 | nazwa | odpowiedz 2
  5. 1 | nazwa | odpowiedz 3
  6. 2 | nazwa2 | odpowiedz 1
  7. 2 | nazwa2 | odpowiedz 2
  8. 2 | nazwa2 | odpowiedz 3


Teraz widac ze jest nadmiarowosc to nie przeszkadza ?
Poza tym implementacja przykladowa:
  1. $sondaSprawdzana='';
  2. foreach($sondy AS $s)
  3. {
  4. if($sondaSprawdzana!=$s->id)
  5. {
  6. echo 'nazwa sondy: '.$s->nazwa_sondy;
  7. $sondaSprawdzana = $s->id;
  8. }
  9. echo 'odpowiedz: '.$s->odpowiedz;
  10. }



Tutaj zrobilem tak, ze na poczatku id sondy nie zgadza sie z obecnym ($sondaSprawdzana), wiec wyswietla tytul pierwszej sondy, nastepnie same odpowiedzi do sondy dopoki sie nie zmieni ID sondy, wtedy wywietlany jest znowu tytul itd.
No i trzeba sprawdzac listujac odpowiedzi kiedy jest juz nastepna sonda.

Moze rozwiazujesz to innym sposobem ?
nospor
Cytat
Teraz widac ze jest nadmiarowosc to nie przeszkadza ?
no w tym przypadku nadmiarowosc jest normalna. Nie jest to nadmiarowosc bazy a jedynie przy pobieraniu.

Podczas pobierania powinienes najpierw sobie w tablicy pogrupowac te dane, dla sondy przypisac odpowiedzi. Potem mając już taką tablicę spokojnie dane wyswietlac.
Zasada jest prosta - najpierw przygotowujesz dane, potem wyswietlasz smile.gif.
oczywiscie mozesz zamiast pogrupowac od razu wyswietlac - efekt bedzie taki sam ino wiekszy bałagan

Cytat
No i trzeba sprawdzac listujac odpowiedzi kiedy jest juz nastepna sonda.
no dokladnie. Przeciez to zaden problem.

Cytat
Moze rozwiazujesz to innym sposobem ?
jesli wyswietlam od razu jak ty tutaj, to podobnie robie.
jesli zas zapisuje najpierw do tablicy, to sprawdzam czy index jest juz w tablicy czy nie. nie tworze dodatkowej zmiennej pomocniczej
quality
Ok dzieki o to mi chodzilo.
Temat jak dla mnie wyczerpany winksmiley.jpg

pozdrawiam

Hmmm a jednak jest jeszcze jeden wazny szegol smile.gif

Mianowicie stosujac ta metode jak zrobic stronnicowanie ?
Przeciez stosujac LIMIT nie bede mial limitu sond tylko samych odpowiedzi, a to jest nie dopuszczalne.

Stronnicowanie po stronie php odpada juz calkowicie, no bo za duze obciazenia, zeby pobierac cala baze za jednym zamachem.

Oczywiscie mozna pobierac limitem, ale tylko jesli by byla rowna ilosc odpowiedzi dla kazdej sondy, wtedy problem by zniknal bo by mozna bylo pomnozyc ilosc sond razy ilosc odpowiedzi. No ale niestety tak nie jest jak sobie z tym radzisz nospor ?

Pozdrawiam
nospor
dwa zapytania:
jedno, do pobrania limitem sond.
drugie do pobrania odpowiedzi dla sond z pierwszego zapytania

podkreslam: dwa zapytania a nie zadna petla a w niej wykonywane zapytanie smile.gif
quality
Hmmm czyli jednak pierwszy sposob tongue.gif

Trzeba tylko z pierwszego zapytania (tego o same sondy) pobrac ID i pozniej pobrac komentarze do nich. Rozumiem przez Twoje "podkreslenie" ze jesli chodzi o drugie zapytanie to najlepiej zrobic "Select odpowiedzi .. where id IN (...) " ?
nospor
Cytat
Hmmm czyli jednak pierwszy sposob
trzeba bylo mowic od razu ze stronicowanie bedziesz robil winksmiley.jpg

Cytat
Rozumiem przez Twoje "podkreslenie" ze jesli chodzi o drugie zapytanie to najlepiej zrobic "Select odpowiedzi .. where id IN (...) " ?
Milo dla odmiany pomagac na forum komus, kto chwyta w mig smile.gif
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.