【发布时间】:2014-11-06 05:08:35
【问题描述】:
如何获取所有记录,除了按record_id分组的最新记录?
表:
attachments
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| record_id | int(11) | NO | | NULL | |
| created | date | NO | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
表格附件中的源测试行:
mysql> select * from attachments;
+----+-----------+------------+
| id | record_id | created |
+----+-----------+------------+
| 1 | 1 | 2014-11-05 |
| 2 | 1 | 2014-11-04 |
| 3 | 1 | 2014-11-03 |
| 4 | 1 | 2014-11-02 |
| 5 | 2 | 2014-11-05 |
| 6 | 2 | 2014-11-04 |
| 7 | 2 | 2014-11-03 |
+----+-----------+------------+
我创建了这个查询,但是对于大表来说太慢了:
SELECT * FROM attachments WHERE id NOT IN (
SELECT
attachments.id
FROM attachments
GROUP BY attachments.record_id
ORDER BY attachments.`created` DESC
)
结果:
+----+-----------+------------+
| id | record_id | created |
+----+-----------+------------+
| 2 | 1 | 2014-11-04 |
| 3 | 1 | 2014-11-03 |
| 4 | 1 | 2014-11-02 |
| 6 | 2 | 2014-11-04 |
| 7 | 2 | 2014-11-03 |
+----+-----------+------------+
我的加入查询得到相反的结果,选择的唯一最新的按record_id分组:
SELECT old.*
FROM attachments `old`
INNER JOIN attachments `new` ON `new`.id = `old`.id
GROUP BY new.record_id
ORDER BY old.`created` DESC
结果:
+----+-----------+------------+
| id | record_id | created |
+----+-----------+------------+
| 1 | 1 | 2014-11-05 |
| 5 | 2 | 2014-11-05 |
+----+-----------+------------+
将 INNER 更改为 RIGHT 或 LEFT 不会更改输出结果。
【问题讨论】: