基本上,我希望从过去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
?
答案 0 :(得分:1)
...尤里卡
在伪代码中:
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);
然后执行此查询。