2010-07-27 16 views
6

Ich habe ein Problem der Auswahl 6 zufällige FreundePHP MySQL wählen zufällige Reihen

Dies ist die Abfrage, die ich bisher habe:

$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']; 
} 

I 6 zufällige Freunde auswählen möchten, wenn der angemeldete Benutzer hat sich mehr oder gleich 6 Freunde

für eine Weile jetzt auf das Stuck:/

Vielen Dank für jede Hilfe :)

+1

Nur wenn die Person 6 oder mehr Freunde hat? –

+0

Ein bisschen abseits von Thema, aber Sie können Zeit sparen, indem Sie geschweifte Klammern in Strings verwenden. Wie anstelle von ''". $ _ SESSION [' userid ']. "'" 'Sie können' '{$ _SESSION [' userid ']}}' ' – Shubham

+0

nur verwenden, wenn die Person 6 oder mehr hat, ja gut zu wissen :) – NoobiCake

Antwort

15

Wenn Sie:

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

Wenn die Person nur drei Freunde hat, wird die Abfrage zeigt nur die drei - es bedeutet nicht, dass die Abfrage immer sechs Zeilen angezeigt werden kann.

+5

Auftrag von Rand ist gefährlich langsam mit vielen Daten. – cbednarski

+1

Hier gibt es einen Artikel mit Details und Alternativen: http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-- from-table/ – cbednarski

0

zuerst die Anzahl der Freunde wählen, dass der Benutzer hat:

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

... setzen, dass in eine Variable, nennen wir es "$ numFriends" Dann:

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

Muss ich diese Abfrage in einem num_rows oder fetch_array verwenden? – NoobiCake

0

Änderung limit 1 zu limit 6 in der achten Zeile.

1

Es macht nichts, ich es herausgefunden :)
Hatte während nicht für zu verwenden: 'D

0

Statt SELECT * am Anfang, versuchen SELECT COUNT(*) und den tatsächlichen Rückgabewert anstelle von num_rows().

Ihre Schleife könnte Duplikate generieren. Ich würde vorschlagen, versuchen OMG Ponys zu antworten.

Es gibt ein ganzes Kapitel über zufällige Auswahl in dem Buch SQL Antipatterns.

5

Der beste Weg, den ich gefunden habe, um eine beliebige Anzahl von zufälligen Datensätzen auszuwählen, ist mit OFFSET in der Abfrage.

Nehmen wir an, Sie wollen 6 zufällige Datensätze, also werde ich aus einer Antwort oben ausleihen und die Gesamtzahl der Freunde in der Datenbank zählen.

$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 

Jetzt werden wir die 6 zufällige Datensätze aus der Gesamt oben erhalten (hoffentlich es ist> 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 
} 

Offset- nicht sein kann, die beste oder effizienteste, aber es funktionierte für Ich über große Datenbanken, ohne sie zu stören.