通过返回一组mysql组

时间:2012-03-13 22:37:28

标签: mysql group-by having

我知道有很多类似的线程与此相关,但我找不到适合我情况的线程。

我正在寻找的是一个mysql语句,它允许我按user_id分组并返回最大ID集(id不是唯一列)。

这是我的数据:

id      url_id  submit_date         engine  status  message
14738   3629    2009-01-02 18:43:55 0pn 10  NULL
14738   3629    2009-01-02 18:43:55 Abacho  10  NULL
14738   3629    2009-01-02 18:43:55 Acoon   10  NULL
14739   3629    2009-01-02 18:43:55 Alexa   10  NULL
14739   3629    2009-01-02 18:43:55 Amfibi  10  NULL
14739   3629    2009-01-02 18:43:55 Burf    10  NULL
14740   4115    2009-01-02 18:43:55 0pn 10  NULL
14740   4115    2009-01-02 18:43:55 Abacho  10  NULL
14740   4115    2009-01-02 18:43:55 Acoon   10  NULL
14741   4115    2009-01-02 18:43:55 Alexa   10  NULL
14741   4115    2009-01-02 18:43:55 Amfibi  10  NULL
14741   4115    2009-01-02 18:43:55 Burf    10  NULL

这是我的sql语句:

SELECT * FROM table WHERE url_id IN (3629,4115) group by url_id having max(id);

问题是该语句仅输出该组的顶级搜索引擎。我需要该ID集中包含的所有搜索引擎。我也不想使用嵌套的sql语句,因为它会导致相当大的性能损失。

2 个答案:

答案 0 :(得分:1)

SELECT * FROM table A,
(SELECT * FROM table WHERE url_id IN (3629,4115) group by url_id having max(id)) B
WHERE A.id=B.id;

答案 1 :(得分:0)

由于您提到要避免使用子查询和派生表,因此应尝试使用自我排除连接。
说明:使用自连接,我们创建另一个表,用于比较第一个表以查找最新的id,即每个{id值没有url_id的行1}}。

SELECT t.* 
  FROM yourtable t 
       LEFT JOIN yourtable t2 
       ON t2.url_id = t.url_id
   AND t2.id > t.id
 WHERE t.url_id IN (3629,4115)
   AND t2.id IS NULL;

返回此内容(我在测试b / c时省略了最后两列,在本例中它们无关紧要):

14739   3629    2009-01-02 18:43:55 Alexa
14739   3629    2009-01-02 18:43:55 Amfibi
14739   3629    2009-01-02 18:43:55 Burf
14741   4115    2009-01-02 18:43:55 Alexa
14741   4115    2009-01-02 18:43:55 Amfibi
14741   4115    2009-01-02 18:43:55 Burf

SQLized here。 (似乎不支持自联接,因此定义并填充两次相同的表。)