2010-04-07 231 views
9

我必须为每个主题选择最后两条记录。如何选择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 

我怎样才能做到这一点?

感谢

+0

有没有我们可以假设的捷径?例如在上面的数据中,你的id是没有漏洞的升序,对于升序的id,你也有上升的topic_id - 如果我们可以假设它会使查询更容易。另一种方法可以使用假设每个topic_id至少有两个条目。我们可以假设吗? – Unreason 2010-04-08 10:36:05

回答

1

你可以

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是没有漏洞的上升,则可以进一步改进查询。

+0

它给了我以下错误“MySQL尚不支持”限制& IN/ALL/ANY/SOME子查询'“ – Salil 2010-04-08 09:54:05

+0

答案更新,以弥补我不知道的MySQL限制。 – Unreason 2010-04-08 11:39:52

0

我想知道更好的答案,但以下查询将起作用。

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

实际上它不会(在第二个子查询中存在缺少g的错误,寻找roup),但更重要的是 - mysql不保证组中未包含的列的值来自最后一条记录,并且可以自由返回它选择的任何值(或换句话说,如果您的查询返回了期望的结果,那么根据定义它只是巧合,它可能会在任何给定时刻停止工作) – Unreason 2010-04-08 14:37:25

3

解决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 

让我知道如何为你工作。

+0

使用此查询,我在“错误列”中找到错误“Unknown column'a.topic_id' where子句'“ – rayne 2017-04-10 07:26:35

3
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 
相关问题