Mysql 选择行分组依据并按另一列排序

标签 mysql sql

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

表格看起来像

+----+------------+-------------+-----------+
| 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        |
+----+------------+-------------+-----------+

http://www.sqlfiddle.com/#!2/cec99/1

所以,基本上,我只想返回 ids (3,4,5,6,8),因为它们是 group_name 和 list_name 中最旧的。忽略最新条目并通过根据 group_name 和 list_name 进行分组来返回旧条目

我无法为这个问题编写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 :http://www.sqlfiddle.com/#!2/00d43/10

更新(根据您的要求)

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, list_name having group_name = a.group_name
  and list_name = a.list_name
);

参见:http://www.sqlfiddle.com/#!2/cec99/3

更新(不使用相关子查询而是使用简单子(monad)查询)

根据: Subqueries vs joins 确定相关子查询太慢

因此我改为连接基于嵌套查询的别名临时表。

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 fiddle :http://www.sqlfiddle.com/#!2/5df64/8

关于Mysql 选择行分组依据并按另一列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16836693/

相关文章:

php - 归档 mysql 数据抛出内存限制问题

python - 监控数据库相关事件的最佳实践

mysql - 如何从一个表返回一组值并从另一个表返回正确的唯一值?

mysql - 相当于 sql server 中表 information_schema.tables 中的 MYSQL AUTO_INCREMENT 列

sql - Oracle 半正矢查询

mysql - 一张表多字段到另一张表

python - 模板的 Django/SQL 复式表

php - 在 Cakephp 查找查询中转义特殊字符

mysql - 我应该在此查询中使用什么来替换 GROUP BY?

php - 在 Laravel/Eloquent 中返回多个而不是一个