MySQL JOIN查询返回重复行问题排查求助
问题排查与解决思路
从你的查询结果和描述来看,playermessage表本身没有重复数据,但JOIN后出现重复行,核心原因是关联的子表中存在重复匹配的记录,具体分析如下:
1. 重复来源定位
你的SQL语句是三个表的关联查询:
SELECT m.* , p.image_url , r.acceptance_status from playermessage m join playerprofile p on p.player_id = m.sender_id join requesttempstorage r on r.requester_id = m.sender_id where m.player_id = 48
因为playermessage中关于sender_id=53的记录只有1条,但JOIN后出现2条重复行,说明:
- 要么
playerprofile表中存在多条player_id=53的记录(但你的结果里image_url完全一致,这种可能性较低) - 要么
requesttempstorage表中存在多条requester_id=53的记录(这是最可能的原因,因为acceptance_status也完全相同,符合重复数据的特征)
你可以先单独执行这条SQL验证:
SELECT * FROM requesttempstorage WHERE requester_id = 53;
如果返回2条完全相同的记录,那就是问题根源了。
2. 临时解决办法(快速去重)
如果暂时不想修改表数据,可以在查询中加入DISTINCT关键字来去除重复行:
SELECT DISTINCT m.* , p.image_url , r.acceptance_status from playermessage m join playerprofile p on p.player_id = m.sender_id join requesttempstorage r on r.requester_id = m.sender_id where m.player_id = 48
或者也可以通过GROUP BY指定所有查询字段来实现去重(注意不同数据库对GROUP BY的语法要求可能略有差异):
SELECT m.* , p.image_url , r.acceptance_status from playermessage m join playerprofile p on p.player_id = m.sender_id join requesttempstorage r on r.requester_id = m.sender_id where m.player_id = 48 GROUP BY m.player_id, m.player_message, m.date_sent, m.sender_id, p.image_url, r.acceptance_status;
3. 彻底解决(修复数据)
如果确认requesttempstorage中存在重复数据,建议直接清理重复记录,比如:
-- 先备份数据,避免误删 CREATE TABLE requesttempstorage_backup AS SELECT * FROM requesttempstorage; -- 删除重复行(保留最新的一条,假设表中有自增ID字段id) DELETE FROM requesttempstorage WHERE requester_id = 53 AND id NOT IN ( SELECT MAX(id) FROM requesttempstorage WHERE requester_id = 53 GROUP BY requester_id );
如果表中没有唯一标识字段,也可以用临时表的方式去重后重新插入。
内容的提问来源于stack exchange,提问作者Hamza Shakil
相关产品推荐
相关产品推荐

