2012-03-13 56 views
1

我知道这里有很多类似的线程,但是我找不到适合我的情况的线程。mysql group by return a set

我在找的是一个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语句,因为它会导致相当显着的性能下降。

回答

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

我知道我提到过我不想嵌套语句,但是这个查询没有办法。它在具有377K结果的数据库中以1.3秒的时间返回了我的结果。谢谢! – greatwitenorth 2012-03-14 14:12:30

+0

我们欢迎队友... :) – Teja 2012-03-14 14:14:22

+0

我需要2点morev to upvote – greatwitenorth 2012-03-15 15:16:07

0

既然你提到你想避免使用子查询和派生表,你应该尝试使用自我排除连接。
说明:通过自联接,我们创建另一个表,通过该表比较第一个表以找到最近的id,即每个url_id的值不大于id的行。

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。 (自连接似乎不被支持,所以相同的表被定义并填充了两次。)