Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] algorytm wyciagania danych z bazy
Beacri
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 4
Dołączył: 19.02.2008
Skąd: Łódź

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


Witam,
mam 2 tabele w bazie: userzy i pliki. Chcę wyświetlać listę plików z nazwami użytkowników i szukam najwydajniejszego rozwiązania.

5 lat temu zrobiłbym coś na kształt:
  1. $mq=mysql_query("select * from pliki");
  2. while($mfa=mysql_fetch_assoc($mq)){
  3.  
  4. $usr=mysql_fetch_assoc(mysql_query("select imie from users"));
  5. echo "plik: $mfa[plik] od $usr[imie]<br>";
  6. }


ale przy 20 plikach baza zaczyna się przypalać, zwłaszcza jak korzysta z tego 50+ osób.

teraz wpadłem na pomysł (schematycznie opsiane):

  1. $i=0;
  2. $mq=mysql_query("select * from pliki");
  3. while($mfa=mysql_fetch_assoc($mq)){
  4. $stringi.="plik: $mfa[plik] od #user$i<br>";
  5.  
  6. $userlista.="ID=$mfa[wlasciciel],";
  7. $i++;
  8. }
  9.  
  10. $mq=mysql_query("select imie from userzy where $userlista");
  11. $i=0;
  12. while($mfa=mysql_fetch_assoc($mq)){
  13. str_replace("#user$i", $mfa[imie], $stringi);
  14. $i++;
  15. }
  16.  
  17. echo $stringi;


ale ciągle mam wrażenie, że jest to do zrobienia prościej. Macie może jakieś pomysły lub sprawdzone rozwiązania do tego?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zilvck
post
Post #2





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 7.04.2012

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


Ja mam podobny problem z tym, że chce wypisać wszystkich "klientów" i tych którzy posiadają produkt i tych którzy nie posaidają.

Żeby zobrazować o co mi chodzi:

Mam w bazie takie tabele:
(IMG:http://img209.imageshack.us/img209/5413/screen1eo.jpg)

A chciałbym osiągnąć taki efekt wypisywania danych:
(IMG:http://img140.imageshack.us/img140/8796/screen2iy.jpg)

Kod który odpowiada za wyświetlenie danych:
  1. <?php
  2. #zapytanie do bazy w poszukiwaniu klientow
  3. $sql_klient = mysql_query("SELECT * FROM klient") or die(mysql_error());
  4.  
  5. #jesli znaleziono klientów wyświetl w pętli
  6. if(mysql_num_rows($sql_klient) > 0){
  7.  
  8. #===WYŚWIETLANIE KLIENTÓW START===
  9. while($i = mysql_fetch_assoc($sql_klient)){
  10. echo 'ID: '.$i['id'].' Klient: '.$i['imie'].' '.$i['nazwisko'];
  11.  
  12. #zapytanie do bazy w poszukiwaniu produktu 1 przypisanego do klienta
  13. $sql_produkt1 = mysql_query("SELECT * FROM produkt1 WHERE poid='{$i['id']}'") or die(mysql_error());
  14.  
  15. if(mysql_num_rows($sql_produkt1) > 0){
  16. while($j = mysql_fetch_assoc($sql_produkt1)){
  17. echo '<br /> Produkt1 ID: '.$j['poid'].' Opis: '.$j['opis'];
  18. }
  19. } echo '';
  20.  
  21.  
  22. #zapytanie do bazy w poszukiwaniu produktu 2 przypisanego do klienta
  23. $sql_produkt2 = mysql_query("SELECT * FROM produkt2 WHERE krid='{$i['id']}'") or die(mysql_error());
  24.  
  25. if(mysql_num_rows($sql_produkt2) > 0){
  26. while($k = mysql_fetch_assoc($sql_produkt2)){
  27. echo '<br /> Produkt2 ID: '.$k['krid'].' Opis: '.$k['kwota'].'<br />';
  28. }
  29. } echo '<hr /><br />';
  30. }
  31. #===WYŚWIETLANIE KLIENTÓW KONIEC===
  32. }
  33. ?>


Problem polega na tym, że przy 100 klientach skrypt będzie przesyłał 200 zapytań do bazy co nie jest pożądane.
Próbowałem różnych kombinacji zapytania SELECT ale nic mi się nie udawało.
Ktoś ma pomysł jak uprościć ten fragment kodu?

Z góry dziękuje za pomoc.

PS. Powyższe schematy jak i kod są uproszczone (nie ma tabel ani formatowania tekstu). Interesuje mnie tylko samo zapytanie i warunki do wyświetlenia danych.

Pozdrawiam, Zilvck



EDIT:
Dla wszystkich którzy szukają podobnego rozwiązania. Na podstawie różnego rodzaju kursów metodą prób i błędów zrobiłem wszystko na jednym zapytaniu.

  1. <?php
  2. //zapytanie do bazy w poszukiwaniu klientow oraz przyporządkowanie do nich produktu1 i produktu2 jeśli istnieją
  3. $sql_klient = mysql_query("SELECT * FROM klient LEFT JOIN produkt1 ON (id = poid) LEFT JOIN produkt2 ON (id = krid)") or die(mysql_error());
  4.  
  5. //jesli znaleziono klientów wyświetl w pętli
  6. if(mysql_num_rows($sql_klient) > 0){
  7.  
  8. while($i = mysql_fetch_assoc($sql_klient)){
  9. echo 'ID: '.$i['id'].' Klient: '.$i['imie'].' '.$i['nazwisko'].'<br />'; //wyświetla użytkownika
  10. if($i['poid'])echo 'POID: '.$i['poid'].' Produkt1: '.$i['opis_poid'].'<br />'; //jeśli klient kupił produkt 1 wyświetla jego nazwę
  11. if($i['krid'])echo 'KRID: '.$i['krid'].' Produkt2: '.$i['opis_krid'].'<br />'; //jeśli klient kupił produkt 2 wyświetla jego nazwę
  12. echo '<br /><hr />'; //oddziela rekordy od siebie
  13. }
  14. }
  15. ?>


Ten post edytował zilvck 7.04.2012, 21:48:32
Go to the top of the page
+Quote Post

Posty w temacie


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: 3.10.2025 - 07:46