Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中执行动态联合查询?_Mysql_Sql - Fatal编程技术网

如何在MySQL中执行动态联合查询?

如何在MySQL中执行动态联合查询?,mysql,sql,Mysql,Sql,mytable有一个自动递增的id列,它是一个整数,出于所有目的,在本例中,您可以安全地假设id越高表示最近的值。mytable还有一个名为group_id的索引列,它是groups表的外键 我需要一个快速的脏查询,从mytable中为每个组id选择最近的5行 如果只有三组,这将很容易,因为我可以这样做: SELECT * FROM `mytable` WHERE `group_id` = 1 ORDER BY `id` DESC LIMIT 5 UNION ALL SELECT * FRO

mytable有一个自动递增的id列,它是一个整数,出于所有目的,在本例中,您可以安全地假设id越高表示最近的值。mytable还有一个名为group_id的索引列,它是groups表的外键

我需要一个快速的脏查询,从mytable中为每个组id选择最近的5行

如果只有三组,这将很容易,因为我可以这样做:

SELECT * FROM `mytable` WHERE `group_id` = 1 ORDER BY `id` DESC LIMIT 5 
UNION ALL 
SELECT * FROM `mytable` WHERE `group_id` = 2 ORDER BY `id` DESC LIMIT 5 
UNION ALL 
SELECT * FROM `mytable` WHERE `group_id` = 3 ORDER BY `id` DESC LIMIT 5 
但是,没有固定数量的组。组由组表中的内容决定,因此组的数量不确定

到目前为止,我的想法是:

我可以在groups表上抓取一个游标,构建一个新的SQL查询字符串,然后执行它。然而,这看起来真的很混乱,我希望有更好的方法来做。 我可以在groups表上抓取一个光标,将内容插入到临时表中,然后从中进行选择。然而,这看起来也很混乱。 我不知道是否可以抓取一个光标,然后直接从那里返回行。是否有类似于SQLServer的@table类型变量的东西? 我最希望的是我想得太多了,在SELECT语句中有一种方法可以做到这一点。
在其他RDBMS中,SQL Server、Postgre SQL、Oracle等的窗口函数可以最好地处理每个组中最近的n行,但不幸的是MySql没有任何窗口函数,所以作为替代方案,有一种解决方案是使用用户定义的变量为属于同一组的行按组id的顺序分配排名,id desc对于按组正确排序结果很重要

SELECT  c.*
FROM (
SELECT *,
@r:= CASE WHEN @g = group_id THEN @r + 1 ELSE 1 END rownum,
@g:=group_id
FROM mytable
CROSS JOIN(SELECT @g:=NULL ,@r:=0) t
  ORDER BY group_id,id desc
) c
WHERE c.rownum <=5

上面的查询将为每个组id提供5个最近的行,如果您想获得5个以上的行,只需将外部查询的where筛选器更改为您所需的数字where c.rownum我在哪里可以了解有关您在这里执行的操作的更多信息?我以前从未见过@x:=语法。@SoaperGEM这里是一个很好的教程