2012-11-28 42 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 ;