MySQL查询获取所有最高ID

时间:2011-04-18 21:59:31

标签: mysql sql

我有这样的表或查询结果。

    id  name url
    --- ---- ---
    1   AAA  http://aaa.com?r=123
    2   AAA  http://aaa.com?r=456
    1   BBB  http://bbb.com?r=xyz
    2   BBB  http://bbb.com?r=qsd
    3   BBB  http://bbb.com?r=fgh
    4   BBB  http://bbb.com?r=jkl
    1   CCC  http://ccc.com?r=a23
    3   CCC  http://ccc.com?r=bc6

我真正想要的是获得ID最高的所有唯一名称。基本上就是这样。

    id  name url
    --- ---- ---
    2   AAA  http://aaa.com?r=456
    4   BBB  http://bbb.com?r=jkl
    3   CCC  http://ccc.com?r=bc6

我可以添加或更改查询以获得该结果。

建议的解决方案不起作用或返回错误的结果

好吧最后我似乎自己找到了,这似乎有效:

SELECT id, name, url
FROM yourtable
WHERE concat(id, name) IN 
(SELECT concat(max(id), name) FROM yourtable GROUP BY name)



id  name url
   --- ---- ---
   2   AAA  http://aaa.com?r=456
   4   BBB  http://bbb.com?r=jkl
   3   CCC  http://ccc.com?r=bc6

4 个答案:

答案 0 :(得分:1)

SELECT id, name, url
FROM yourtable
WHERE id IN (SELECT max(id) FROM yourtable GROUP BY name))

内部查询为表中的每个“名称”提取最高ID号,然后外部查询使用这些ID来获取这些ID出现的其余行。

答案 1 :(得分:0)

添加GROUP BY id ORDER BY id ASC

这样的东西
SELECT id, name, url FROM yourtable GROUP BY id ORDER BY id ASC

答案 2 :(得分:0)

此解决方案无需使用Concat

即可运行
SELECT yt.id, 
    yt.name, 
    yt.url
FROM yourtable yt
INNER JOIN 
        (SELECT max(id) id ,
         name 
         FROM yourtable GROUP BY name) maxyt
ON yt.id  = maxyt.id
   AND yt.name = maxyt.name;

使用concat(id, name)可能有效,但它有两个问题。

  1. 它绝对不是SARGable(我不是100%确定我的解决方案)
  2. 如果有人输入像1AAA这样的名字会导致问题,因为Concat(11,'AAA') = Concat (1,'1AAA')

答案 3 :(得分:0)

终于明白了。

SELECT id, name, url, sum(id) as demosum FROM table_name GROUP BY name ORDER BY ID DESC

这应该有效。