MySQL新手求助:如何剔除PROPERTYVALUE='NG'对应的所有PARENTID
解决MySQL中剔除含PROPERTYVALUE='NG'的PARENTID的问题
嘿,作为MySQL新手,这种筛选需求其实挺典型的,我来一步步帮你搞定!
首先明确你的核心需求:要排除所有关联过PROPERTYVALUE='NG'的PARENTID对应的所有记录——也就是说,只要某个PARENTID下有任意一条记录的PROPERTYVALUE是'NG',这个PARENTID的所有数据都要被排除在最终结果之外。
先对应你的数据示例
输入数据参考:
| PARENTID | PROPERTYVALUE | 其他字段... |
|---|---|---|
| 101 | OK | ... |
| 101 | NG | ... |
| 102 | OK | ... |
| 103 | NG | ... |
| 104 | OK | ... |
| 104 | OK | ... |
期望输出参考:
| PARENTID | PROPERTYVALUE | 其他字段... |
|---|---|---|
| 102 | OK | ... |
| 104 | OK | ... |
| 104 | OK | ... |
两种实用解决方案
方案1:子查询写法(直观易懂,适合新手)
这是最容易理解的写法,先找出所有带'NG'的PARENTID,再排除它们:
SELECT * FROM your_table WHERE PARENTID NOT IN ( -- 先筛选出所有PROPERTYVALUE为'NG'的PARENTID,去重避免重复计算 SELECT DISTINCT PARENTID FROM your_table WHERE PROPERTYVALUE = 'NG' );
方案2:LEFT JOIN写法(性能更优,适合大数据表)
如果你的表数据量较大,LEFT JOIN的执行效率通常比NOT IN更高:
SELECT t.* FROM your_table t LEFT JOIN ( SELECT DISTINCT PARENTID FROM your_table WHERE PROPERTYVALUE = 'NG' ) ng_ids ON t.PARENTID = ng_ids.PARENTID -- 只保留关联不上NG列表的记录,也就是没有NG的PARENTID WHERE ng_ids.PARENTID IS NULL;
额外小提示
- 记得把
your_table替换成你实际使用的表名 - 如果是要删除这些记录而非查询,建议先用SELECT验证结果,再改成DELETE操作(用JOIN写法更安全):
DELETE t.* FROM your_table t JOIN ( SELECT DISTINCT PARENTID FROM your_table WHERE PROPERTYVALUE = 'NG' ) ng_ids ON t.PARENTID = ng_ids.PARENTID;
删除前一定要备份数据,避免误操作!
内容的提问来源于stack exchange,提问作者Natasha Perera
相关产品推荐
相关产品推荐

