我知道有很多类似的线程与此相关,但我找不到适合我情况的线程。
我正在寻找的是一个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语句,因为它会导致相当大的性能损失。
答案 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。 (似乎不支持自联接,因此定义并填充两次相同的表。)