Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: optymalizacja prostego zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
Tymto
Witam

mam taki oto działający kod:

  1. <?php
  2. $zapytanie ="SELECT friends.sender, friends.receiver FROM friends WHERE (friends.ver=1) AND (friends.receiver='$profileid[user_id]' OR friends.sender='$profileid[user_id]') order by id DESC limit 5";
  3.            $wynik=mysqli_query($db, $zapytanie);
  4.            $rows_number=mysqli_num_rows($wynik);
  5.            echo 'last added friends:<br>';
  6.                for ($i=1; $i<=$rows_number; $i++)
  7.                {
  8.                $row=mysqli_fetch_assoc($wynik);
  9.  
  10.                    if ($row['receiver']==$profileid[user_id])
  11.                    {
  12.                    $send2 ="SELECT user_login FROM users WHERE user_id='$row[sender]'";
  13.                    $answer3=mysqli_query($db, $send2);
  14.                    $friendname=mysqli_fetch_array($answer3);
  15.                    $friendname2=str_replace(' ', '_', $friendname['user_login']);
  16.                    echo '<br>';
  17.                    echo '<a href="user.php?profile='.$friendname2.'"><img src="./mini/'.$row[sender].'.jpg" alt="wrong picture" border=0/></a><br><a href="user.php?profile='.$friendname2.'">'.$friendname['user_login'].'</a>';
  18.                    }
  19.                    if ($row['sender']==$profileid[user_id])
  20.                    {
  21.                    $send2 ="SELECT user_login FROM users WHERE user_id='$row[receiver]'";
  22.                    $answer3=mysqli_query($db, $send2);
  23.                    $friendname=mysqli_fetch_array($answer3);
  24.                    $friendname2=str_replace(' ', '_', $friendname['user_login']);
  25.                    echo '<br>';
  26.                    echo '<a href="user.php?profile='.$friendname2.'"><img src="./mini/'.$row[receiver].'.jpg" alt="wrong picture" border=0/></a><br><a href="user.php?profile='.$friendname2.'">'.$friendname['user_login'].'</a>';
  27.                    }
  28.                    
  29.                }
  30. ?>


Kod ten dziala na portalu spolecznosciowym i jego zadaniem jest wyświetlenie listy ostatnio dodanych znajomych aktualnie oglądanego profilu. Znajomy jest wyswietlany tylko jesli jego status jako przyjaciela jest potwierdzony, w zapytaniu informajca o potwierdzeniu znajduje sie w kolumnie 'ver' i przyjmuje 1 jesli propozycja przyjazni zostala zaakceptowana. Kod w tej postaci dziala, jednak jestem pewien, że odpowiedz na zapytania ktore znajduja sie w petli for, mozna uzyskac juz w pierwszym zapytaniu select. Dokładnie chodzi o uzyskanie w pierwszym zapytaniu inforcji o user_login z tabeli users. I tutaj moja prośba, czy ktos moglby pomóc mi w zoptymalizowaniu tego zapytania?, z góry dziękuję i pozdrawiam.

Struktura tabel:

friends:
-sender (przechowuje wartosc user_id z tabeli users)
-receiver (przechowuje wartosc user_id z tabeli users)
-ver (status znajomsci, 1=potwierdzona, 0= niepotwierdzona)

users:
-user_id
-user_login
-...
drucik
Witam,

Wystarczy połączyć z tabelką users i wybrać z niej kolumnę "user_login":
Kod
SELECT friends.sender, friends.receiver, u.user_login FROM friends

[b]JOIN users u
  ON u.user_id = friends.sender
[/b]
WHERE (friends.ver=1)
  AND (friends.receiver='$profileid[user_id]' OR friends.sender='$profileid[user_id]')

order by id DESC

limit 5


Opis różnych typów złączeń tabel (pdf):
http://www.if.uz.zgora.pl/~adam/materialy/...a8/zajecia8.pdf
Tymto
Jest postęp, jednak to jeszcze nie to, nie mogę napisac:

  1. JOIN users u ON u.user_id = friends.sender


ponieważ u.user_id może przyjmować wartość friends.sender lub friends.receiver w zależności od tego czy friends.sender='$profileid[user_id]' czy friends.receiver='$profileid[user_id]'
W obecnej postaci kod wyswietla tylko znajomych ktorzy zaproponowali znajomosc.
Stworzyłem cos takiego:
  1. SELECT f.sender, f.receiver, u.user_login FROM friends f RIGHT OUTER JOIN users u ON u.user_id = f.receiver RIGHT OUTER JOIN users n ON n.user_id = f.sender WHERE (f.ver=1) AND (f.receiver='$profileid[user_id]' OR f.sender='$profileid[user_id]') ORDER BY f.id DESC LIMIT 5


jednak to rownież nie pomaga sad.gif juz nie mam zadnych pomyslow jak rozwiazac ten problem, moze komus uda się coś wymyśleć?

Problem rozwiązałem przez UNION:
  1. SELECT f.sender, u.user_login FROM friends f JOIN users u ON u.user_id = f.sender WHERE (f.ver=1) AND (f.receiver='$profileid[user_id]')
  2. UNION
  3. SELECT f.receiver, u.user_login FROM friends f JOIN users u ON u.user_id = f.receiver WHERE (f.ver=1) AND (f.sender='$profileid[user_id]')


Wyniki są prawidłowe, jednak mam problem z sortowanie, dodając na koncu zapytania order by, otrzymuje blad. Jak sobie z tym poradzic?
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.