MySQL如何筛选无重复国家记录的查询方法求助
解决方法
首先明确核心问题:你需要的是仅保留表中Country只出现一次的记录,而SELECT DISTINCT country, number, state是对整行的列组合去重,当同一Country对应不同的Number/State时会保留多条,自然达不到预期效果。
以下是两种实用的解决方法:
方法1:分组统计子查询(兼容所有主流数据库)
先统计每个Country的出现次数,再筛选出仅出现一次的记录:
SELECT Country, Number, State FROM tbl_country WHERE Country IN ( SELECT Country FROM tbl_country GROUP BY Country HAVING COUNT(*) = 1 );
如果需要同时获取Id列,可改用内连接:
SELECT t.Id, t.Country, t.Number, t.State FROM tbl_country t INNER JOIN ( SELECT Country FROM tbl_country GROUP BY Country HAVING COUNT(*) = 1 ) cnt ON t.Country = cnt.Country;
方法2:窗口函数(适用于MySQL 8.0+、PostgreSQL、SQL Server等新版本数据库)
通过窗口函数标记每个Country的出现次数,再筛选结果:
SELECT Country, Number, State FROM ( SELECT Country, Number, State, COUNT(*) OVER (PARTITION BY Country) AS country_count FROM tbl_country ) t WHERE country_count = 1;
补充说明
如果你的实际需求是每个Country只取任意一条记录(即使存在重复Country),可以用窗口函数取分组内第一条:
SELECT Country, Number, State FROM ( SELECT Country, Number, State, ROW_NUMBER() OVER (PARTITION BY Country ORDER BY Id) AS row_num FROM tbl_country ) t WHERE row_num = 1;
内容的提问来源于stack exchange,提问作者Qmails
相关产品推荐
相关产品推荐

