Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] algorytm wyciagania danych z bazy
Forum PHP.pl > Forum > Bazy danych > MySQL
Beacri
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?
pmir13
Wystarczyłby najzwyklejszy join:

  1. SELECT p.plik, u.imie
  2. FROM pliki p JOIN userzy u
  3. ON p.wlasciciel = u.id


I dostajesz gotowe do wyświetlenia pary plik,imię. Zwróć też uwagę na to by w select mieć tylko to, co potrzebujesz. Po co przesyłać wszystkie kolumny?
Beacri
W SELECT jest wszytko co potrzebuję (później jedynie ścieżkę dostępu będę ukrywał). Trochę zmodyfikuję zapytanie i kod i myślę, ze będzie działało dobrze. Dzięki za pomoc smile.gif


EDIT:
OK, wiem o co Ci chodziło z SELECTEM. Muszę wypisać wszystkie pola z tabeli jeden i tylko IMIE z tabeli dwa. jeszcze raz dzięki.
zilvck
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:


A chciałbym osiągnąć taki efekt wypisywania danych:


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. ?>
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.