【问题标题】:SELECT only one entry of multiple occurrences仅选择多次出现的一项
【发布时间】:2014-01-27 20:26:48
【问题描述】:

假设我有一个如下所示的表格:

id fk 值 ------------ 1 1 'lorem' 2 1 'ipsum' 3 1 '多尔' 4 2“坐” 5 2 '满足' 6 3 'consettur' 7 3 'sadipscing'

每个 fk 可以出现多次,对于每个 fk 我想选择最后一行(或者更准确地说是分别具有最高 id 的行)——像这样:

id fk 值 ------------ 3 1 '多尔' 5 2 '满足' 7 3 'sadipscing'

我想我可以像这样在这里使用关键字DISTINCT

SELECT DISTINCT id, fk, value 
FROM table

但我不确定DISTINCT 将返回哪一行,它必须是最后一行。 有没有类似 (pseudo)

SELECT id, fk, value 
FROM table 
WHERE MAX(id) 
FOREACH DISTINCT(fk)

我希望我在这里有意义:) 谢谢你的时间

【问题讨论】:

    标签: mysql sql select group-by greatest-n-per-group


    【解决方案1】:

    你也可以

    SELECT id, fk, value FROM table GROUP BY fk HAVING id = MAX(id)
    

    我这里没有mysql,但是在Sybase ASE中可以用

    【讨论】:

    • 我在我的 MySQL 数据库上尝试了您的建议,但返回了 0 行。但是感谢您指出关键字“HAVING”,它在我以后的查询中肯定会很有用
    【解决方案2】:

    试试这个:

    SELECT a.id, a.fk, a.value
    FROM tableA a 
    INNER JOIN (SELECT MAX(a.id) id, a.fk FROM tableA a GROUP BY a.fk
               ) AS b ON a.fk = b.fk AND a.id = b.id;
    

    SELECT a.id, a.fk, a.value
    FROM (SELECT a.id, a.fk, a.value FROM tableA a ORDER BY a.fk, a.id DESC) AS a 
    GROUP BY a.fk;
    

    【讨论】:

      【解决方案3】:
      SELECT * 
        FROM table  
        WHERE id IN (SELECT MAX(id) FROM table GROUP BY fk)
      

      【讨论】:

        【解决方案4】:

        试试这个:

        SELECT t.* FROM
        table1 t
        JOIN (
          SELECT MAX(id) as id
          FROM table1
          GROUP BY fk
        ) t1
        ON t.id = t1.id
        

        内部查询将使用MAX() 为您提供每个 fk 的最高 id。然后我们将这个内表与您的主表连接起来。

        【讨论】:

          猜你喜欢
          • 2017-04-02
          • 1970-01-01
          • 1970-01-01
          • 2020-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多