如何为MySQL中的每个主题id选择最后两条记录

如何为MySQL中的每个主题id选择最后两条记录,sql,mysql,Sql,Mysql,我必须为每个主题选择最后两条记录 例: 表:味精 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 (

我必须为每个主题选择最后两条记录

例: 表:味精

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是每个主题的唯一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

不支持IN子句后面的限制的SQL解决方案很简单。只需在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

让我知道这对您有何影响。

它给了我以下错误“MySQL还不支持'LIMIT&;IN/ALL/ANY/SOME subquery'”答案已更新,以弥补我不知道的MySQL限制。我们可以采用哪些捷径?例如,在上面的数据中,您的id是无孔的升序id,对于升序id,您也有升序主题id-如果我们可以假设这会使查询更容易的话。另一种方法可以假设每个主题id至少有两个条目。我们可以这样假设吗?实际上不会(第二个子查询中有一个拼写错误缺少g,请查找组)但更重要的是,mysql不会保证组中未包含的列的值来自最后一条记录,并且可以自由返回它选择的任何值(或者换句话说,如果您的查询返回所需的结果,那么根据定义,这只是巧合,它可能会在任何给定时刻停止工作),我得到错误“where子句”中的未知列“a.topic\u id”
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
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