如何筛选playlisticons表中Tom未在playlist表中拥有的记录
解决查询playlisticons表中Tom未拥有图标的问题
原SQL的问题
你的查询逻辑存在两个核心问题:
- 关联条件使用
playlisticons.name != playlist.icon会导致不必要的笛卡尔积匹配,每个playlisticons记录会和所有不匹配的playlist记录关联,最终产生重复行 WHERE playlist.userFK = 'Tom'会将LEFT JOIN降级为INNER JOIN,过滤掉所有playlist端无匹配的记录,完全违背了"找未拥有图标"的需求
正确的查询写法
方法1:LEFT JOIN + IS NULL(推荐)
通过LEFT JOIN关联Tom的playlist记录,筛选出关联不上的图标,保留LEFT JOIN特性的同时精准过滤:
SELECT playlisticons.name, playlisticons.link FROM playlisticons LEFT JOIN playlist ON playlisticons.name = playlist.icon AND playlist.userFK = 'Tom' WHERE playlist.playlistID IS NULL;
方法2:NOT IN
通过子查询获取Tom已拥有的图标列表,直接排除这些记录:
SELECT name, link FROM playlisticons WHERE name NOT IN ( SELECT icon FROM playlist WHERE userFK = 'Tom' );
方法3:NOT EXISTS
用存在性判断筛选出Tom未关联的图标,逻辑更直观:
SELECT name, link FROM playlisticons pl WHERE NOT EXISTS ( SELECT 1 FROM playlist p WHERE p.userFK = 'Tom' AND p.icon = pl.name );
验证结果
以上三种写法都会返回你期望的结果:
| name | link |
|---|---|
| Like | link3 |
内容的提问来源于stack exchange,提问作者Armistice
相关产品推荐
相关产品推荐

