使用DISTINCT的mysql只有一列

时间:2016-02-02 17:31:24

标签: mysql

有没有办法使用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不起作用。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

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

SELECT id, name, countryCode FROM tablename GROUP BY name

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

这只是一种MySQL行为,GROUP BY的传统处理表明它只应与聚合值一起使用(参见MySQL Handling of GROUP BY)。

答案 1 :(得分:0)

在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重复,则上述查询会按字母顺序选择 first countrycode的行。

Demo here

答案 2 :(得分:0)

试试这个:

SELECT id,name, countryCode FROM table GROUP BY countryCode

答案 3 :(得分:0)

为每个组分配一个行号。

<强>查询

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