LIMIT 由 1 到 10 之间的随机数
LIMIT by random number between 1 and 10
本质上,我想 return 最近 21 天的 X 条记录,上限为 10 条记录。
如何将 随机 LIMIT
添加到 MySQL 中的查询?
这是我的查询,X
用于随机数 1-10。
SELECT releases.id, COUNT(charts_extended.release_id) as cnt FROM releases
INNER JOIN charts_extended
ON charts_extended.release_id=releases.id
WHERE DATEDIFF(NOW(), releases.date) < 21
GROUP BY releases.id
ORDER BY RAND()
LIMIT 0, X
我尝试使用 RAND() * 10 + 1
,但出现语法错误。
有什么方法可以使用 pure SQL;即不使用应用程序语言将查询作为字符串 "build" 并让应用程序语言以编程方式填写 X
?
您的查询是正确的,但您需要更新限制条款。
$query = "SELECT releases.id, COUNT(charts_extended.release_id) as cnt FROM releases
INNER JOIN charts_extended
ON charts_extended.release_id=releases.id
WHERE DATEDIFF(NOW(), releases.date) < 21
GROUP BY releases.id
ORDER BY RAND()
LIMIT 0,".rand(1,10);
然后执行这个查询。
尤里卡...
在伪代码中:
- 执行查询 select 10 个随机行
- select 从使用用户定义的变量分配行号 0-9 来计算
- 通过单击
rand()
进行交叉连接以创建数字 0-9 和 select 行号小于或等于该数字的所有行
这是解决方案的本质(您可以调整您的查询以使用它:
select * from (
select *, (@row := coalesce(@row + 1, 0)) row from (
// your query here, except simply LIMIT 10
select * from mytable
order by rand()
limit 10
) x
) y
cross join (select rand() * 10 rand) z
where row <= rand
参见 SQLFiddle。 运行 重复几次,您会看到随机得到 1-10 行。
如果您不想看到行号,您可以将外部 select *
更改为 select 只有您希望在结果中出现的内部查询的特定列。
本质上,我想 return 最近 21 天的 X 条记录,上限为 10 条记录。
如何将 随机 LIMIT
添加到 MySQL 中的查询?
这是我的查询,X
用于随机数 1-10。
SELECT releases.id, COUNT(charts_extended.release_id) as cnt FROM releases
INNER JOIN charts_extended
ON charts_extended.release_id=releases.id
WHERE DATEDIFF(NOW(), releases.date) < 21
GROUP BY releases.id
ORDER BY RAND()
LIMIT 0, X
我尝试使用 RAND() * 10 + 1
,但出现语法错误。
有什么方法可以使用 pure SQL;即不使用应用程序语言将查询作为字符串 "build" 并让应用程序语言以编程方式填写 X
?
您的查询是正确的,但您需要更新限制条款。
$query = "SELECT releases.id, COUNT(charts_extended.release_id) as cnt FROM releases
INNER JOIN charts_extended
ON charts_extended.release_id=releases.id
WHERE DATEDIFF(NOW(), releases.date) < 21
GROUP BY releases.id
ORDER BY RAND()
LIMIT 0,".rand(1,10);
然后执行这个查询。
尤里卡...
在伪代码中:
- 执行查询 select 10 个随机行
- select 从使用用户定义的变量分配行号 0-9 来计算
- 通过单击
rand()
进行交叉连接以创建数字 0-9 和 select 行号小于或等于该数字的所有行
这是解决方案的本质(您可以调整您的查询以使用它:
select * from (
select *, (@row := coalesce(@row + 1, 0)) row from (
// your query here, except simply LIMIT 10
select * from mytable
order by rand()
limit 10
) x
) y
cross join (select rand() * 10 rand) z
where row <= rand
参见 SQLFiddle。 运行 重复几次,您会看到随机得到 1-10 行。
如果您不想看到行号,您可以将外部 select *
更改为 select 只有您希望在结果中出现的内部查询的特定列。