2016-07-16 50 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

,你可以在SQL查詢中直接使用ORDER BY RAND()

SELECT * FROM table ORDER BY RAND() LIMIT 1 

ORDER BY RAND()實際上使你隨機順序排,然後你只需要做LIMIT 1以獲得只有一行,第一個。

1

在您的代碼,請執行以下操作:

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

然後使用PHP來生成隨機id做:

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

隨着id指數 - 和合理假設不存在在價值觀上存在太大的差距 - 那麼這將很好地發揮作用。

你可以做同樣的事情,在短短一個查詢:

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執行一個查詢()

相關問題