Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [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?


--------------------
Nie bijcie! Jestem tylko Chemikiem, który skryptuje od 7 lat :D
www.eduela.pl
Go to the top of the page
+Quote Post
pmir13
post
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


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?
Go to the top of the page
+Quote Post
Beacri
post
Post #3





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

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


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.

Ten post edytował Beacri 7.04.2012, 11:16:06


--------------------
Nie bijcie! Jestem tylko Chemikiem, który skryptuje od 7 lat :D
www.eduela.pl
Go to the top of the page
+Quote Post
zilvck
post
Post #4





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:


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


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

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 04:31