我的数据库表有15条记录,我想在屏幕上随机显示9。MySQL RAND()7 LIMIT
SELECT * FROM tablename ORDER BY RAND() LIMIT 9
这是按预期工作,但如果表只有9个记录呢?我需要抽出15个随机记录。
我知道这会重复一个或多个记录,但这是我的意图。
我的数据库表有15条记录,我想在屏幕上随机显示9。MySQL RAND()7 LIMIT
SELECT * FROM tablename ORDER BY RAND() LIMIT 9
这是按预期工作,但如果表只有9个记录呢?我需要抽出15个随机记录。
我知道这会重复一个或多个记录,但这是我的意图。
您的select
只会拉取表中的记录数,而不管order by
。但是,您可以在订购之前使用各种方法复制表格数据。例如,排在一起的两倍union all
:
select * from
(
select * from tablename
union all
select * from tablename
) as tmp
order by rand() limit 9
RAND()本身当你处理一个大型数据库的效率不高。
做这样的查询的更好的方法是:
-1。查询最大的id(假设id是唯一密钥)
-2。使用php的php函数javascript生成15个随机数,从1到max_id,推送到阵列
-3。将数组爆炸(例如$ id_list =“'”.implode(“','”,$ id_list)。“'”)
-4。选择* from tablename其中id为($ id_list)
我明白需要优化,但这是一个非常小的应用程序,从来没有任何时候都有超过50条记录:) – user1861039
即使您在表格中只有一行,这也可以工作。如果您有少于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 ;
感谢您的答复,unfortunaltly这将导致以下错误 “每个派生的表必须有它自己的别名”,所以我suspose我需要查询别名命名:) – user1861039
当表格有4行或更少的行时,这当然会显示少于9个结果。 –
而当表格有9行或更多行时,(9)结果中可能仍有重复项,而其他行根本不会返回。 (这可能是由OP所要求的,但应该提及的是 –