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