Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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,我试图通过“分组依据”从表中选择行,并忽略通过按日期对数据进行排序得到的第一行。排序应按日期字段进行,以忽略最新条目并返回组的旧条目 这张桌子看起来像 +----+------------+-------------+-----------+ | id | updated on | group_name | list_name | +----+------------+----------------+--------+ | 1 | 2013-04-03 | g1 | l1

我试图通过“分组依据”从表中选择行,并忽略通过按日期对数据进行排序得到的第一行。排序应按日期字段进行,以忽略最新条目并返回组的旧条目

这张桌子看起来像

+----+------------+-------------+-----------+
| id | updated on | group_name  | list_name |
+----+------------+----------------+--------+
| 1  | 2013-04-03 | g1          | l1        |
| 2  | 2013-03-21 | g2          | l1        |
| 3  | 2013-02-26 | g2          | l1        |
| 4  | 2013-02-21 | g1          | l1        |
| 5  | 2013-02-20 | g1          | l1        |
| 6  | 2013-01-09 | g2          | l2        |
| 7  | 2013-01-10 | g2          | l2        |
| 8  | 2012-12-11 | g1          | l1        |
+----+------------+-------------+-----------+
所以,基本上,我只想返回ID 3,4,5,6,8,因为它们是组名和列表名中最古老的。忽略最新条目并通过基于组名称和列表名称对其进行分组来返回旧条目

我无法为这个问题编写sql。我知道order by无法与group by一起工作。请帮我想出一个解决办法

谢谢


还有,有没有一种不使用子查询的方法可以做到这一点?

类似于下面的方法,只获取特定行的最短日期行:

select a.ID, a.updated_on, a.group_name, list_name
from data a 
where
a.updated_on < 
(
select max(updated_on)
from data 
group by group_name having group_name = a.group_name
);
SQL Fiddle:

根据您的需求进行更新 见:

更新为不使用相关子查询而使用简单子查询 基于以下原因确定的相关子查询太慢:

所以我改为使用基于嵌套查询的别名临时表进行连接

select a.ID, a.updated_on, a.group_name, a.list_name
from data a,
(
select group_name, list_name , max(updated_on) as MAX_DATE
from data 
group by group_name, list_name 
) as MAXDATE   
where
a.list_name = MAXDATE.list_name AND
a.group_name = MAXDATE.group_name AND
a.updated_on < MAXDATE.MAX_DATE
;

SQL FIDLE:

您可以尝试使用以下查询是的,它有一个嵌套联接,但可能会有所帮助

SELECT ID FROM 
(select d1.ID FROM data d1 LEFT JOIN 
data d2 ON (d1.group_name = d2.group_name AND d1.list_name=d2.list_name AND 
d1.updated_on > d2.updated_on) WHERE d2.ID IS NULL) data_tmp;
更正:


请花点时间整理一个连贯的求助请求。我完全不知道你想要完成什么。你能进一步解释一下吗?你所说的基于组名和列表名是什么意思?是否要从每个组中提取一个旧的行@Vivek,是的,但我需要为group_name创建的所有旧条目,忽略group_name g1的id 1,因为这是最新条目。请使用SQL Fiddle@user2436575为什么不使用“7”?但我需要组的所有条目,除了最新的条目哦,好吧……只需进行一个小的编辑,即可使用max:开始。。。小于最新条目的最大值…使用新数据更新SQLFIDLE。谢谢你的回答。但这不是我所期望的。返回集应为3,4,5,6,8。由于id-7是g2&l2@user2436575给我你的SQL小提琴的链接。。。我以为你想忽略每个组名的最新条目。。。是否要整体忽略最新条目?忘记发布链接了。我想忽略组名和列表名的最新条目。应该只返回3,4,5,6,8在这种情况下,您是否检查了它返回的结果?根据:{3,6,8}我对10000个元素进行了查询。。。存在与非随机联接相关的性能问题。。10000 X 10000=100000000行,在何处筛选…:
SELECT ID FROM 
(select d1.ID FROM data d1 LEFT JOIN 
data d2 ON (d1.group_name = d2.group_name AND d1.list_name=d2.list_name AND 
d1.updated_on > d2.updated_on) WHERE d2.ID IS NULL) data_tmp;
SELECT DISTINCT(ID) FROM 
(select d1.* FROM data d1 LEFT JOIN 
data d2 ON (d1.group_name = d2.group_name AND d1.list_name=d2.list_name AND 
d1.updated_on < d2.updated_on) WHERE d2.ID IS NOT NULL) date_tmp;
SELECT DISTINCT y.id 
  FROM data x 
  JOIN data y 
    ON y.group_name = x.group_name 
   AND y.list_name = x.list_name 
   AND y.updated_on < x.updated_on;