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 只有您希望在结果中出现的内部查询的特定列。