MySQL查询:如何筛选仅关联country=7的唯一pid记录
检索仅关联country=7的pid记录
给定MySQL表数据:
| pid | country |
|---|---|
| 436 | 1 |
| 436 | 5 |
| 436 | 7 |
| 439 | 7 |
| 440 | 3 |
| 446 | 7 |
| 446 | 1 |
需求是找出仅关联country=7、未关联其他country值的pid,正确结果为439。直接执行SELECT * from table_name WHERE country = 7;会返回包含关联其他country的pid(如436、446),无法满足需求,以下是几种可行的实现方式:
方法1:GROUP BY + HAVING 分组筛选
通过分组统计每个pid的唯一country数量,同时确保唯一值为7:
SELECT pid FROM table_name GROUP BY pid HAVING COUNT(DISTINCT country) = 1 AND MAX(country) = 7;
COUNT(DISTINCT country) = 1:确保该pid仅关联一种country值MAX(country) = 7:验证这个唯一的country值是7(用MIN(country)效果一致)
方法2:子查询排除法
先找出所有关联过非7 country的pid,再从country=7的记录中排除这些pid:
SELECT DISTINCT pid FROM table_name WHERE country = 7 AND pid NOT IN ( SELECT pid FROM table_name WHERE country != 7 );
DISTINCT用于避免同一pid有多条country=7记录时重复输出- 子查询生成的是所有存在其他country关联的pid列表,主查询过滤掉这些pid后得到目标结果
方法3:LEFT JOIN 匹配排除
通过左连接自身表,筛选出没有非7 country关联的pid:
SELECT DISTINCT t1.pid FROM table_name t1 LEFT JOIN table_name t2 ON t1.pid = t2.pid AND t2.country != 7 WHERE t1.country = 7 AND t2.pid IS NULL;
- 左连接后,
t2.pid IS NULL表示该pid没有匹配到任何非7的country记录 - 结合
t1.country = 7即可确定目标pid仅关联country=7
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

