MySQL关联四张表查询球员Bree参与的所有比赛问题求助
错误原因
- 误用
INNER JOIN关联所有表:一场比赛要么分出胜负(仅Winners、Losers表有对应记录),要么平局(仅Draws表有对应记录),不可能同时存在三类记录,INNER JOIN要求四表同时匹配到数据才会返回,所以加入Draws表后查询结果为空 - 存在语法错误:关联Losers表时字段名误写为
Match ID(多了空格),实际应为MatchID - 筛选条件位置错误:球员匹配条件写在了JOIN的ON子句中,而非专门的筛选WHERE子句
- 分组逻辑错误:指定的分组字段
match_id_num不存在于查询返回字段中,且需求不需要分组,核心要求是按比赛日期排序 - 返回字段设计不合理:仅查询
Winners.Name,若目标球员是落败/平局状态,该字段会返回空值
正确查询代码
推荐使用UNION ALL合并三类参赛人员表后再关联比赛表的写法,逻辑更清晰,执行效率更高:
SELECT m.ID AS MatchID, m.MatchName, m.MatchDate, p.PlayerName, p.ResultType FROM Matches m INNER JOIN ( -- 合并获胜、落败、平局三类参赛记录,统一字段格式 SELECT MatchID, Name AS PlayerName, IDNum, '获胜' AS ResultType FROM Winners UNION ALL SELECT MatchID, Name AS PlayerName, IDNum, '落败' AS ResultType FROM Losers UNION ALL SELECT MatchID, Name AS PlayerName, IDNum, '平局' AS ResultType FROM Draws ) p ON m.ID = p.MatchID WHERE -- 按球员唯一ID筛选,若要按姓名查找替换为 p.PlayerName = 'Bree' 即可 p.IDNum = 5 -- 按比赛日期排序,DESC为最新比赛在前,要升序排列改为ASC即可 ORDER BY m.MatchDate DESC;
如果需要保留多表JOIN的写法,可以改用LEFT JOIN实现:
SELECT m.ID AS MatchID, m.MatchName, m.MatchDate, COALESCE(w.Name, l.Name, d.Name) AS PlayerName FROM Matches m LEFT JOIN Winners w ON m.ID = w.MatchID AND w.IDNum = 5 LEFT JOIN Losers l ON m.ID = l.MatchID AND l.IDNum = 5 LEFT JOIN Draws d ON m.ID = d.MatchID AND d.IDNum = 5 WHERE -- 筛选出至少在一类结果中出现的目标球员的比赛 w.ID IS NOT NULL OR l.ID IS NOT NULL OR d.ID IS NOT NULL ORDER BY m.MatchDate DESC;
内容的提问来源于stack exchange,提问作者Mr R G
相关产品推荐
相关产品推荐

