2010-07-27 16 views
6

mam problem wybieranie 6 losowych znajomychPHP MySQL wybrać losowe wierszy

To zapytanie mam tak daleko:

$result = num_rows("SELECT * FROM friends WHERE member_id = '".$_SESSION['userid']."'"); 
if($result >= 6) { 
    $f_num = 6; 
} else { 
    $f_num = $result; 
} 
for($i = 1; $i <= $f_num; $i++) { 
    $q_get_member_friends = mysql_query("SELECT * FROM friends WHERE member_id = '".$_SESSION['userid']."' ORDER BY rand() LIMIT 1"); 
    $r_get_member_friends = mysql_fetch_array($q_get_member_friends); 
    echo $r_get_member_friends['friend_with']; 
} 

Chcę wybrać 6 losowych znajomych czy zalogowany użytkownik ma więcej lub równa 6 przyjaciół

Stuck na to już od dłuższego czasu:/

dzięki za pomoc :)

+1

Tylko jeśli dana osoba ma 6 lub więcej znajomych? –

+0

Odrobina tematu, ale można zaoszczędzić czas za pomocą nawiasów klamrowych. Zamiast "" ". $ _ SESSION ['userid']." '"' Możesz użyć '' {$ _SESSION ['userid']} ''' – Shubham

+0

tylko, jeśli dana osoba ma 6 lub więcej, tak wiem :) – NoobiCake

Odpowiedz

15

Jeśli używasz:

SELECT * 
    FROM friends 
    WHERE member_id = '".$_SESSION['userid']."' 
ORDER BY rand() 
    LIMIT 6 

Jeżeli osoba ma tylko 3 znajomych, kwerenda pokaże tylko te trzy - to nie znaczy, że zapytanie będzie zawsze wrócić sześć wierszy.

+5

Porządek według randu jest niebezpiecznie wolny z dużą ilością danych. – cbednarski

+1

Tutaj jest artykuł ze szczegółami i alternatywami: http://www.titov.net/2005/09/21/do-not-use-order-by-rand-orhow-to-get-random-rows- from-table/ – cbednarski

0

Najpierw wybierz liczbę znajomych, że użytkownik posiada:

"SELECT COUNT(*) as numFriends FROM friends WHERE member_id='".$_SESSION['userid']."' 

... umieścić, że do zmiennej, nazwijmy to "$ numFriends" Następnie:

for($z=0;$z<6;$z++) 
{ 
    $randomFriendIndex = rand(1,$numFriends); 
    //Get the friend at that index 
} 
+0

Czy muszę użyć tego zapytania w num_rows lub fetch_array? – NoobiCake

0

zmiana limit 1 do limit 6 w ósmym wierszu.

1

Nieważne, I zdobione :)
musieli użyć podczas nie dla: 'D

0

Zamiast SELECT * na początku, spróbuj SELECT COUNT(*) i wykorzystywać rzeczywistą wartość zwracana zamiast NUM_ROWS().

Twoja pętla może generować duplikaty. Proponuję wypróbować odpowiedź OMG Kucyków.

Istnieje cały rozdział dotyczący losowego wyboru w książce SQL Antipatterns.

5

Najlepszy sposób, w jaki znalazłem dowolną liczbę losowych rekordów, to OFFSET w zapytaniu.

Załóżmy, że chcesz 6 losowych rekordów, więc pożyczę od odpowiedzi powyżej i policzę całkowitą liczbę znajomych w bazie danych.

$sql = mysql_query("SELECT COUNT(*) AS total FROM friends WHERE member_id='". $_SESSION['userid'] ."'"); 

$get_count = mysql_fetch_array($sql); // Fetch the results 

$numfriends = $get_count['total']; // We've gotten the total number 

Teraz dostaniemy 6 losowe rekordy z sumy powyżej (mam nadzieję, że to> 6),

$query = mysql_query("SELECT * FROM friends WHERE member_id='". $_SESSION['userid'] ."' LIMIT 6 OFFSET " . (rand(0, $numFriends)); 


while ($rows = mysql_fetch_array($query)) 
{ 
    /// show your $rows here 
} 

Korzystanie OFFSET nie może być najlepszy i najbardziej skuteczny, ale pracował dla ja na dużych bazach danych, nie grzebiąc ich.

Powiązane problemy