使用INNER JOIN查询两表数据出现重复行问题求助
解决INNER JOIN查询出现重复行的问题
嘿,我来帮你捋清楚这个重复行的问题:
为什么会出现重复行?
你的查询里,tbl_tag_note_join是笔记和标签的关联表——很明显,一个笔记可以对应多个标签(比如某条笔记同时被标记了tag_id=2和3)。当你用INNER JOIN关联两张表时,每一条匹配的关联记录都会和笔记表中的对应行组合,所以同一个笔记会被输出多次,每次对应一个它关联的标签。
几种解决方案,你可以根据需求选择:
1. 只获取唯一的笔记数据(不需要标签信息)
如果你的目标只是拿到符合标签条件的笔记内容,不需要显示标签,可以用DISTINCT去重,或者通过GROUP BY分组:
- 用
DISTINCT的写法:
SELECT DISTINCT n.* FROM tbl_note n INNER JOIN tbl_tag_note_join t ON n.n_id = t.n_id WHERE t.tag_id IN (2,3) ORDER BY n.n_id DESC
- 用
GROUP BY的写法(注意不同数据库对GROUP BY的规则有差异,比如MySQL如果开启了ONLY_FULL_GROUP_BY,需要确保SELECT里的列都在GROUP BY中或者是聚合函数):
SELECT n.* FROM tbl_note n INNER JOIN tbl_tag_note_join t ON n.n_id = t.n_id WHERE t.tag_id IN (2,3) GROUP BY n.n_id ORDER BY n.n_id DESC
2. 保留标签信息,但合并同一笔记的标签
如果需要同时看到笔记和对应的标签,又不想重复显示笔记内容,可以把同一个笔记的标签合并成一个字段,不同数据库的函数略有不同:
- MySQL用
GROUP_CONCAT:
SELECT n.*, GROUP_CONCAT(t.tag_id SEPARATOR ', ') AS tags FROM tbl_note n INNER JOIN tbl_tag_note_join t ON n.n_id = t.n_id WHERE t.tag_id IN (2,3) GROUP BY n.n_id ORDER BY n.n_id DESC
- PostgreSQL/SQL Server用
STRING_AGG(SQL Server 2017+支持):
-- PostgreSQL SELECT n.*, STRING_AGG(t.tag_id::TEXT, ', ') AS tags FROM tbl_note n INNER JOIN tbl_tag_note_join t ON n.n_id = t.n_id WHERE t.tag_id IN (2,3) GROUP BY n.n_id ORDER BY n.n_id DESC -- SQL Server SELECT n.*, STRING_AGG(CAST(t.tag_id AS VARCHAR), ', ') AS tags FROM tbl_note n INNER JOIN tbl_tag_note_join t ON n.n_id = t.n_id WHERE t.tag_id IN (2,3) GROUP BY n.n_id ORDER BY n.n_id DESC
内容的提问来源于stack exchange,提问作者Nikunj Patel
相关产品推荐
相关产品推荐

