Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Pokazanie danych, przy wielu zapytaniach
Forum PHP.pl > Forum > Przedszkole
Ayrox
Na serwisie nasza-klasa jak ktoś ma znajomych np 300, to jak wchodzę w jego znajomych to widzę 

np.

Użytkownik1 z Wrocławia

Użytkownik2 z Poznania

Użytkownik3 z Koszalina

itd itd

Teraz moje pytanie czy przy odczytywaniu z tabeli znajomi znajomych w skrypcie dodatkowo jest zapytanie do kazdego uzytkownika do tabeli uzytkownicy gdzie sa podane nazwy miejscowosci? Chyba raczej nie sa w tabeli znajomi przetrzymywane dane zamieszkania znajomych, gdyz wtedy jakby ktos zmienil swoje miejsce zamieszkania to byloby malo wydajne. Jakie rozwiązanie jest najbardziej wydajne?

Mam np 300 znajomych odczytuje ich z tabeli znajomi i do każdego znajomego w pętli zapytanie do tabeli uzytkownicy o miejscowosc zamieszkania? Jakby nie bylo to ok 300 zapytań? Czy takie rozwiazanie jest jedynym mozliwym?
piotrekkr
Wszystko to jest jednym zapytaniem smile.gif domyślam się że używają czegoś co się nazywa złączeniami kilku tabel (z angielskiego JOIN) np ja do pokazania znajomych używam takiego zapytania ( podzapytaniem pobieram też w nim ilość znajomych tego znajomego, pierwsze zdjęcie lub avatar jeśli istnieje inne dane typu login, miasto itd.):
  1. $query = "SELECT friends.*, students.login, students.student_id, photos.thumb_name, avatars.avatar_name,
  2. (SELECT COUNT(f.friend_id)
  3. FROM module_Dates_friends AS f
  4. WHERE (f.recipient_id = friends.recipient_id AND f.sender_id = friends.sender_id OR f.recipient_id = friends.sender_id AND f.sender_id = friends.recipient_id) AND f.accepted=1) AS friends_num
  5. FROM module_Dates_friends AS friends
  6. LEFT JOIN module_Uniwerki_students AS students ON ( students.student_id = friends.sender_id AND friends.sender_id != $student_id) OR (students.student_id = friends.recipient_id AND friends.recipient_id != $student_id)
  7. LEFT JOIN module_Dates_photos AS photos ON ( photos.student_id = friends.sender_id AND friends.sender_id != $student_id) OR (photos.student_id = friends.recipient_id AND friends.recipient_id != $student_id)
  8. LEFT JOIN module_Dates_avatars AS avatars ON ( avatars.student_id = friends.sender_id AND friends.sender_id != $student_id) OR (avatars.student_id = friends.recipient_id AND friends.recipient_id != $student_id)
  9. WHERE (friends.recipient_id = $student_id OR friends.sender_id = $student_id) AND friends.accepted=1
  10. GROUP BY friends.friend_id
  11. ORDER by friends.send_date ASC, photos.photo_id ASC";

Wykonanie oddzielnego zapytania każdego znajomego zapchało by im serwer przez zapchanie bazy :/. Na szczęście są złączenia smile.gif
Ayrox
  1. <?php
  2. $zapytanie = "SELECT * from friends WHERE `zapraszajacy` = '$user' OR `zaproszony` = '$user' AND `status` = '1' ORDER BY 'kiedy' DESC LIMIT 0, 10";
  3. $wynik = mysql_query($zapytanie);
  4.  
  5. while ($wiersz = mysql_fetch_array($wynik)) {
  6.  
  7. $zapraszajacy=$wiersz['zapraszajacy'];
  8. $zaproszony=$wiersz['zaproszony'];
  9.  
  10. if ($zapraszajacy == $user)
  11. {
  12. $jedenzmienna=$zaproszony;
  13. }
  14. else
  15. {
  16. $jedenzmienna=$zapraszajacy;
  17. }
  18.  
  19. $zapytanie = "SELECT `miasto` FROM `uzytkownicy` WHERE `login`='$jedenzmienna';";
  20. $wynik = mysql_query($zapytanie);
  21.  
  22. $danee = mysql_fetch_array($wynik);
  23. $miasto=$danee['miasto'];
  24.  
  25.  
  26.  
  27. echo $jedenzmienna;
  28.  
  29. echo ' z ';
  30.  
  31. echo $miasto;
  32.  
  33.  
  34.  
  35. }
  36. ?>


Tylko kurcze nie wiem jak zrobić to w moim przypadku tongue.gif

Pozdrawiam
Spykaj
Cytat
Chyba raczej nie sa w tabeli znajomi przetrzymywane dane zamieszkania znajomych, gdyz wtedy jakby ktos zmienil swoje miejsce zamieszkania to byloby malo wydajne.


Tak, ale wiesz, jedna duża operacja, a potem ciągle masz wyświetlanie praktycznie w czasie stałym ;] wcale nie takie najgorsze wyjście, w końcu rzeczy najczęściej używane powinny być jak najszybsze, a LEFT JOIN wcale szybkie nie jest ;d a poza tym można nawet umożliwić zmianę miasta tylko raz na dzień (i tak większość użytkowników ma jedną miejscowość przez całe życie smile.gif więc nawet tego nie odczują jako jakiś dyskomfort)
Ayrox
W sumie też masz rację, ale jak np. już tu chodzi o np. jakieś często zmieniane informacje? to co wtedy? biggrin.gif

jak to dla mojego skryptu by wygląało to łączenie tabel?

chodzi mi już teraz o rozwiązanie w postaci pomocy jak "połączyć" te tabelę
piotrekkr
Żeby połączyć ze sobą ludzi w znajomych możesz np stworzyć tabelę ze znjomymi o polach
Kod
sender_id //id wysyłającego zaproszenie
recipient_id //id do kogo wysłane zostało zaproszenie
accepted //czy zostało zaakceptowane zaproszenie

W ten sposób możesz połączyć ludzi w znajomych. I teraz jak chcesz pobrać znajomych uzytkownika to pobierasz:
  1. SELECT u.login, u.city
  2. FROM friends AS f
  3. LEFT JOIN users AS u ON (f.sender_id<>$id AND u.user_id=f.sender_id) OR (f.recipient_id<>$id AND u.user_id=f.recipient_id)
  4. WHERE (f.sender_id=$id OR f.recipient_id=$id) AND accepted=1

accepted=1 znaczy że zaproszenie zaakceptowane i tym samymym są znajomymi smile.gif $id to id usera którego znajomych listę chcesz otrzymać 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.