You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:54:45