2012-11-28 67 views
0

我的數據庫表有15條記錄,我想在屏幕上隨機顯示9。MySQL RAND()7 LIMIT

SELECT * FROM tablename ORDER BY RAND() LIMIT 9 

這是按預期工作,但如果表只有9個記錄呢?我需要抽出15個隨機記錄。

我知道這會重複一個或多個記錄,但這是我的意圖。

回答

0

您的select只會拉取表中的記錄數,而不管order by。但是,您可以在訂購之前使用各種方法複製表格數據。例如,排在一起的兩倍union all

select * from 
(
    select * from tablename 
    union all 
    select * from tablename 
) as tmp 
order by rand() limit 9 
+0

感謝您的答覆,unfortunaltly這將導致以下錯誤 「每個派生的表必須有它自己的別名」,所以我suspose我需要查詢別名命名:) – user1861039

+0

當表格有4行或更少的行時,這當然會顯示少於9個結果。 –

+0

而當表格有9行或更多行時,(9)結果中可能仍有重複項,而其他行根本不會返回。 (這可能是由OP所要求的,但應該提及的是 –

0

RAND()本身當你處理一個大型數據庫的效率不高。

做這樣的查詢的更好的方法是:

-1。查詢最大的id(假設id是唯一密鑰)

-2。使用php的php函數javascript生成15個隨機數,從1到max_id,推送到陣列

-3。將數組爆炸(例如$ id_list =「'」.implode(「','」,$ id_list)。「'」)

-4。選擇* from tablename其中id爲($ id_list)

+0

我明白需要優化,但這是一個非常小的應用程序,從來沒有任何時候都有超過50條記錄:) – user1861039

0

即使您在表格中只有一行,這也可以工作。如果您有少於15(比如11)行,你必須在結果的所有11加上4個隨機的:

SELECT col1, col2, ..., colN    -- the columns of `tablename` only 
FROM 
    (SELECT a.i, b.j, t.* 
    FROM 
      (SELECT *, RAND() AS rnd 
       FROM tablename 
       ORDER BY rnd LIMIT 15 
      ) AS t 
     CROSS JOIN 
      (SELECT 1 AS i UNION ALL SELECT 2 UNION ALL 
       SELECT 3  UNION ALL SELECT 4) 
      AS a 
     CROSS JOIN 
      (SELECT 1 AS j UNION ALL SELECT 2 UNION ALL 
       SELECT 3  UNION ALL SELECT 4) 
      AS b 
    ORDER BY i, j, rnd 
     LIMIT 15 
) AS t15 
ORDER BY RAND() ; 

如果你想「更多的」隨機性,在結果中有重複或三次行有可能是一些行完全不顯示,更換最後五行搭配:

  AS b 
    ORDER BY RAND() 
     LIMIT 15 
) AS t15 ;