【问题标题】:mysql using DISTINCT for only one columnmysql 仅对一列使用 DISTINCT
【发布时间】:2016-02-02 17:31:24
【问题描述】:

有没有办法使用 DISTINCT(或其他关键字)不在一列上显示重复的结果?例如,如果我有一个包含列的表:id、name 和 countryCode

id name countryCode
1  Dan  IE
2  John US
3  John UK
4  Bob  DE

而且我不想显示名称相同的重复项,因此结果将是:

id name countryCode
1  Dan  IE
2  John US
4  Bob  DE

如果我在这里使用 DISTINCT,它需要匹配整行,但我只想在名称匹配时省略一行。有没有办法做到这一点?我在这里找到了类似的解决方案:DISTINCT for only one Column

但这不适用于 mySQL。任何帮助将不胜感激。

【问题讨论】:

  • 那么取哪个县码?
  • 怎么不行?您的查询是什么?
  • distinct 不是一个函数,所以你不能只对一列使用它,它适用于所有选定的列。在您的示例中,为什么您为 John 选择第 2 行而不是第 3 行?
  • 我不介意采用哪个国家代码,但如果有办法选择其中一个,那就太好了

标签: mysql


【解决方案1】:

仅适用于 MySQL(以及相关的发行版,例如 MariaDB),您可以使用GROUP BY

SELECT id, name, countryCode FROM tablename GROUP BY name

请注意,要省略的行不受ORDER BY或类似语句的影响。

这只是 MySQL 的一种行为,GROUP BY 的传统处理规定它只能与聚合值一起使用(请参阅MySQL Handling of GROUP BY)。

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT id,name, countryCode FROM table GROUP BY countryCode
    

    【讨论】:

    • 分组应该按名称,而不是 countryCode。
    【解决方案3】:

    给每组一个行号。

    查询

    select t1.id, t1.name, t1.countryCode from 
    (
        select id, name, countryCode, 
        (
            case name when @curA 
            then @curRow := @curRow + 1 
            else @curRow := 1 and @curA := name end 
        ) + 1 as rn 
        from tblNames t, 
        (select @curRow := 1, @curA := '') r 
        order by id 
    )t1 
    where t1.rn = 1
    order by t1.id;
    

    SQL Fiddle demo

    【讨论】:

    • 谢谢乌拉斯。我试图让这个方法工作,但它不喜欢我的一些列与其他表的连接。当谈到 SQL 时,我不是专业人士,所以我只是选择了上面提到的 GROUP BY,它确实有效。还是谢谢
    【解决方案4】:

    在 MySQL 中,您可以使用变量来模拟ROW_NUMBER 窗口函数:

    SELECT id, name, countrycode
    FROM (
      SELECT id, name, countrycode,
             @rn := IF (@name = name, @rn + 1,
                        IF (@name := name, 1, 1)) AS rn
      FROM mytable
      CROSS JOIN (SELECT @rn := 0, @name := '') AS vars
      ORDER BY name, countrycode) AS t
    WHERE t.rn = 1
    

    如果name 重复,上述查询会按字母顺序选择具有第一个 countrycode 的行。

    Demo here

    【讨论】:

    • 感谢 Giorgos Betsos。我试图让这个方法工作,但它不喜欢我的一些列与其他表的连接。在 SQL 方面我不是专业人士,所以我只是选择了上面提到的 GROUP BY 方法,它确实有效。还是谢谢
    猜你喜欢
    • 2011-06-28
    • 2015-05-13
    • 2012-08-09
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    相关资源
    最近更新 更多