2011-08-03 50 views
1

選擇一個隨機行相當我有一個MySQL表classifieds,它具有以下字段:在MySQL

  • id =主鍵,自動遞增
  • titledesc,........ 。,等領域,
  • featured = int(1)(1或0),但可以改變爲true/false
  • featured_start(date)featured_end(date)

我想在我的主頁上一次性顯示。我的意思是,它不會隨AJAX動態旋轉,而是每次刷新或重新加載頁面(F5)。

有人能給我一些關於如何編碼公平 MySQL查詢一次獲得一個特色分類?公平地說,那個被分類的人不會比其他人顯示更多的時間,當然featured_end必須考慮到沒有顯示過期的分類。

回答

1

ORDER BY RAND() LIMIT 1是抓住一個經典的污垢簡單的方法隨機排。但是,它不能很好地滿足表中的許多行 - 它必須爲表中的每一行運行RAND()函數,然後對所有這些行進行排序(只顯示第一行)。

我會推薦閱讀this useful article

的TL;博士版本:最好的數據庫端解決方案將最有可能是這樣的:

SELECT `your_table`.* 
FROM `your_table` 
JOIN 
(
    SELECT CEIL(RAND() * (SELECT MAX(`id`) FROM `your_table`)) AS `id` 
) AS `random_row` USING(`id`) 

嚴重的,給予該文章的讀,它是你的問題的最好迴應,我想你會找。

對於那些會提出這樣一個事實,即您的主鍵中的間隙會導致不準確:是的,他涵蓋了我鏈接的文章中的內容。

+0

謝謝TehShrike,偉大的文章。唯一的「問題」是表中存在一些不存在的ID,因爲分類可以被刪除,但我會盡量安排 – Enrique

0

你可以試試這個,使用 'RAND' 功能 -

SELECT classifieds.* 
FROM classifieds 
ORDER BY RAND() 
LIMIT 1 
1

採取featured_end考慮添加WHERE featured_end >= CURRENT_DATE,即

SELECT * 
FROM classifieds 
WHERE (featured_end >= CURRENT_DATE)AND(featured = 1) 
ORDER BY RAND() 
LIMIT 1