Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pomysl na pobieranie wielu danych
quality
post
Post #1





Grupa: Zarejestrowani
Postów: 172
Pomógł: 9
Dołączył: 13.02.2006
Skąd: Warszawa

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


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 (IMG:style_emoticons/default/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 ? (IMG:style_emoticons/default/smile.gif) A moze ktos obral inny sposob.

Dzieki za informacje i pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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...(IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
zzeus
post
Post #3





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


Proponuje skorzystać z LEFT JOIN oraz GROUP_CONCAT, wtedy masz jedno zapytanie i nie powtarzają się dane sondy (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
quality
post
Post #4





Grupa: Zarejestrowani
Postów: 172
Pomógł: 9
Dołączył: 13.02.2006
Skąd: Warszawa

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


Hmmm bardzo ciekawe mozecie podac jakis przyklad zapytania ?

Moze zylem w blogiej nieswiadomosci (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/biggrin.gif)

Ten post edytował quality 22.04.2010, 10:10:50
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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





Grupa: Zarejestrowani
Postów: 172
Pomógł: 9
Dołączył: 13.02.2006
Skąd: Warszawa

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


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 ?

Ten post edytował quality 22.04.2010, 10:32:56
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
quality
post
Post #8





Grupa: Zarejestrowani
Postów: 172
Pomógł: 9
Dołączył: 13.02.2006
Skąd: Warszawa

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


Ok dzieki o to mi chodzilo.
Temat jak dla mnie wyczerpany (IMG:style_emoticons/default/winksmiley.jpg)

pozdrawiam

Hmmm a jednak jest jeszcze jeden wazny szegol (IMG:style_emoticons/default/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

Ten post edytował quality 23.04.2010, 08:01:54
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
quality
post
Post #10





Grupa: Zarejestrowani
Postów: 172
Pomógł: 9
Dołączył: 13.02.2006
Skąd: Warszawa

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


Hmmm czyli jednak pierwszy sposob (IMG:style_emoticons/default/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 (...) " ?
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Hmmm czyli jednak pierwszy sposob
trzeba bylo mowic od razu ze stronicowanie bedziesz robil (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)
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: 18.09.2025 - 11:11