限制在1到10之间的随机数

时间:2016-01-18 07:33:26

标签: mysql random sql-limit

基本上,我希望从过去21天返回X个记录,上限为10个记录。

如何在MySQL中的查询中添加随机 public class OrdinaryClass { // if it's a list, you type List (or ArrayList, LinkedList if you know the concrete list type) public void put(List o) { } } // for calling "put" add cast to proper type OrdinaryClass.put((List)tuple.getValueByField("data"));

这是我的查询,LIMIT代表随机数1-10。

X

我尝试使用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 ,但它会出现语法错误。

有没有办法使用纯SQL来做到这一点;即不使用应用程序语言来构建&#34;将查询作为字符串并以应用程序语言以编程方式填写RAND() * 10 + 1

2 个答案:

答案 0 :(得分:1)

...尤里卡

在伪代码中:

  • 执行查询以选择10个随机行
  • 选择使用用户定义的变量分配行号0-9来计算
  • 使用rand()上的单个匹配进行交叉连接以创建数字0-9并选择行号小于或等于该数字的所有行

以下是解决方案的精髓(您可以调整查询以使用它:

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 *以仅选择结果中所需的内部查询中的特定列。

答案 1 :(得分:0)

您的查询是正确的,但您需要更新限制条款。

$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);

然后执行此查询。