2016-07-16 8 views
0

Ich habe eine Tabelle mit etwa 70 Spalten und 120.000 Zeilen von Daten. Ich möchte einen Datensatz randomisieren und dann die Werte anderer Spalten dieses Datensatzes anzeigen. Wenn ich alle Daten noch holen,Abfrage zuerst, dann randomize, und dann die restlichen Felder abrufen

$result=mysqli_query($link, 'SELECT id, column1, column2, column3, ..., column 70 from table'); 
while ($row=mysqli_fetch_array($result)) 
{ 
    $info[] = array('id'=>$row['id'], 'column1'=>$row['column1'], ...); 
} 
$randindex = rand(0,count($info)); 
$id = $info[$randindex]['id']; 
echo $info[$randindex]['column1']; echo $info[$randindex]['column2']; .... 

Ich fürchte, dass dies den Prozess erheblich verlangsamen. Daher möchte ich nur die ID vor der Randomisierung abfragen und dann die randomisierte ID verwenden, um die anderen Werte dieses Datensatzes in der Datenbank abzurufen.

$result=mysqli_query($link, 'SELECT id from table'); 
while ($row=mysqli_fetch_array($result)) 
{ 
    $info[] = $row['id']; 
} 
$randindex = rand(0,count($info)); 
$id = $info[$randindex]; 

und dann alle anderen Felder dieses bestimmten Datensatzes irgendwie abrufen. Ich fragte, wie dies in SQL here zu tun ist, aber ich würde gerne wissen, ob es einen anderen effizienten Weg mit anderen Mitteln als SQL gibt. Muss ich eine Schleife wie this machen?

+0

Sie möchten etwas selbst besser als die Datenbank tun .. hmm. Gibt es einen besonderen Grund dafür, dass Sie nicht alle Spalten gleichzeitig haben wollen, sondern stattdessen 2 Abfragen ausführen? – FirstOne

Antwort

0

Sie ORDER BY RAND() direkt in der SQL-Abfrage verwenden können:

SELECT * FROM table ORDER BY RAND() LIMIT 1 

ORDER BY RAND() macht eigentlich zufällige Reihenfolge von Ihnen Reihen, und dann Sie tun nur LIMIT 1, um nur eine Zeile zu erhalten, die erste.

1

in Ihrem Code wie folgt vor:

select min(id) as minid, max(id) as maxid 
from table; 

Dann PHP verwenden, um ein zufälliges id und tut zu generieren:

select t.* 
from table t 
where t.id >= $randid 
order by id 
limit 1; 

Mit einem Index auf id - und angemessene Annahmen über dort nicht zu große Lücken in den Werten - dann wird das gut funktionieren.

Sie können in nur eine Abfrage das gleiche tun:

select t.* 
from table t cross join 
    (select min(id) as minid, max(id) as maxid from table) tt 
where t.id >= minid + rand() * (tt.maxid - tt.minid) 
order by id 
limit 1; 
0

Ich glaube nicht, dass es gültig ist. Ich denke, es ist schneller ausführen nur eine Abfrage mit ORDER BY RAND()

Verwandte Themen