2016-07-16 9 views
0

私は、約70列と120,000行のデータを持つテーブルを持っています。私がしたいのは、レコードをランダム化し、このレコードの他の列の値を表示することです。 私はすべてのデータをフェッチしない場合は、最初にクエリを実行し、次にランダム化し、残りのフィールドを取得します。

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

は、私は、これはかなり処理が遅くなることを恐れています。ですから、私はランダム化の前にIDだけを照会し、ランダム化されたIDを使用してデータベース内のそのレコードの他の値を検索したいと思います。

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

この特定のレコードの他のすべてのフィールドを何とか取得します。私はSQL hereでこれを行う方法を尋ねましたが、SQL以外の他の手段で効率的な方法があるかどうかを知りたいと思います。 thisのようなループをする必要がありますか?あなたのコードで

+0

自分でデータベースよりも優れた処理をしたいのですが。あなたは一度にすべての列を必要としないで、代わりに2つのクエリを実行する特別な理由はありますか? – FirstOne

答えて

0

ちょうど1つのクエリで同じことを行うことができますあなたはただ1行、最初のものを得るためにちょうどLIMIT 1をします。

1

、次の手順を実行します。

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

次にランダムidを生成するためにPHPを使用して行います。

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

idのインデックスでは - と合理的な仮定がついてません値が大きすぎると、うまくいくでしょう。その後、

SELECT * FROM table ORDER BY RAND() LIMIT 1 

ORDER BY RAND()が実際にあなたのランダムな順番の行を行い、:あなたは、SQLクエリに直接ORDER BY RAND()を使用することができます

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

私はそれが有効ではないと思います。 ORDER BY RAND()で1つのクエリを実行するほうが速いと思います。

関連する問題