如何选择MySQL中每个topic_id的最后两条记录
我必须为每个主题选择最后两条记录。如何选择MySQL中每个topic_id的最后两条记录
例如: 表:味精
id | topic_id
------------
1 | 1
2 | 1
3 | 1
4 | 1
5 | 2
6 | 2
7 | 2
8 | 3
9 | 3
10 | 3
我想获得这些行:
3 1
4 1
6 2
7 2
9 3
10 3
我怎样才能做到这一点?
感谢
你可以
SELECT a.id, a.topic_id
FROM MSG a
WHERE a.id IN (
SELECT t.id
FROM MSG t
WHERE a.topic_id = t.topic_id
ORDER BY t.id DESC
LIMIT 2)
ORDER BY a.topic_id, a.id
编辑: ,因为它似乎是MySQL不允许(!但它会在未来的版本中是可能的)子查询中使用LIMIT这里是一个广义解(有没有捷径的假设,但msg.id每topic_id唯一的):
SELECT a.id, a.topic_id
FROM MSG a
WHERE a.id IN (
SELECT MAX(t.id)
FROM MSG t
WHERE a.topic_id = t.topic_id
) OR
a.id IN (
SELECT MAX(t.id)
FROM MSG t
WHERE a.topic_id = t.topic_id AND
t.id NOT IN (
SELECT MAX(t2.id)
FROM MSG t2
WHERE t.topic_id = t2.topic_id
)
)
ORDER BY a.topic_id, a.id
当然
这是不是很好,但也没办法。如果假定topic_id中的id是没有漏洞的上升,则可以进一步改进查询。
我想知道更好的答案,但以下查询将起作用。
SELECT * FROM msg where id in (SELECT m.id FROM msg m group by topic_id)
or id in (SELECT m1.id FROM msg m1 where id not in (SELECT m2.id FROM msg m2 roup by topic_id)
group by topic_id) order by id
实际上它不会(在第二个子查询中存在缺少g的错误,寻找roup),但更重要的是 - mysql不保证组中未包含的列的值来自最后一条记录,并且可以自由返回它选择的任何值(或换句话说,如果您的查询返回了期望的结果,那么根据定义它只是巧合,它可能会在任何给定时刻停止工作) – Unreason 2010-04-08 14:37:25
解决SQL不支持限制条件后跟IN子句很简单。只需在您的IN子句中构建另一个子查询。举个例子。
SELECT a.id, a.topic_id
FROM MSG a
WHERE a.id IN (
SELECT t.id
FROM (Select * from MSG t
WHERE a.topic_id = t.topic_id
ORDER BY t.id DESC
LIMIT 2)alias)
ORDER BY a.topic_id, a.id
让我知道如何为你工作。
使用此查询,我在“错误列”中找到错误“Unknown column'a.topic_id' where子句'“ – rayne 2017-04-10 07:26:35
SELECT max(id), max(topic_id) FROM msg
GROUP BY topic_id
UNION
SELECT max(id), max(topic_id) FROM msg
WHERE id not in (
SELECT max(id) as id FROM msg
GROUP BY topic_id)
GROUP BY topic_id
有没有我们可以假设的捷径?例如在上面的数据中,你的id是没有漏洞的升序,对于升序的id,你也有上升的topic_id - 如果我们可以假设它会使查询更容易。另一种方法可以使用假设每个topic_id至少有两个条目。我们可以假设吗? – Unreason 2010-04-08 10:36:05