PHP MySQL多表查询获取电影评分评论唯一正确数据问题求助
问题根因
- 关联逻辑错误:你要么是分开查询评论表、评分表后按结果顺序手动拼接数据,只要两个查询返回的用户排序不一致就会出现错配;要么是关联两个表时仅通过电影ID匹配,导致同个电影下的所有评论和所有评分产生笛卡尔积,出现任意配对的错乱情况。
- 表结构设计缺陷:现有表没有记录评论和评分的关联关系,无法区分「评论同时打分」「单独发评论」「单独打分」三种业务场景,也没有同次操作的绑定标识。
- 冗余查询问题:单独查评分时关联电影表没有必要,你已经过滤了指定电影ID,不需要关联电影表就能拿到该电影的所有评分数据。
修正方案
临时修复方案(无需修改现有表结构)
默认遵循业务规则:同一个用户对同一部电影仅有1条有效评分,该用户对该电影的评论默认关联自己的评分,通过一次关联查询直接拿到匹配后的结果,避免手动拼接出错:
SELECT d.评论时间戳, u.username, COALESCE(r.评分分值, '无') AS rating, d.评论内容 FROM discussion d INNER JOIN users u ON d.userID = u.userID -- 关联评分时同时匹配电影ID和用户ID,避免笛卡尔积 LEFT JOIN rating r ON d.movieID = r.movieID AND d.userID = r.userID WHERE d.movieID = <American Psycho的电影ID> -- 补全仅打分没有发评论的记录,不需要可以删掉UNION部分 UNION SELECT NULL AS 评论时间戳, u.username, r.评分分值, '无评论内容' AS 评论内容 FROM rating r INNER JOIN users u ON r.userID = u.userID WHERE r.movieID = <American Psycho的电影ID> AND NOT EXISTS ( SELECT 1 FROM discussion d WHERE d.movieID = r.movieID AND d.userID = r.userID ) ORDER BY 评论时间戳 DESC NULLS LAST;
最优方案(优化表结构彻底解决问题)
给discussion表新增ratingID字段,允许为NULL,关联rating表的主键:
- 用户在reviewMovie页面提交评论+评分时,先写入rating表拿到生成的ratingID,再写入discussion表时填充该字段
- 用户单独提交评论时,
ratingID字段留空
后续查询直接通过ratingID关联即可,完全避免错配:
SELECT d.评论时间戳, u.username, COALESCE(r.评分分值, '无') AS rating, d.评论内容 FROM discussion d INNER JOIN users u ON d.userID = u.userID LEFT JOIN rating r ON d.ratingID = r.ratingID WHERE d.movieID = <American Psycho的电影ID> -- 补全仅打分没有发评论的记录,不需要可以删掉UNION部分 UNION SELECT NULL AS 评论时间戳, u.username, r.评分分值, '无评论内容' AS 评论内容 FROM rating r INNER JOIN users u ON r.userID = u.userID WHERE r.movieID = <American Psycho的电影ID> AND r.ratingID NOT IN ( SELECT ratingID FROM discussion WHERE ratingID IS NOT NULL AND movieID = <American Psycho的电影ID> ) ORDER BY 评论时间戳 DESC NULLS LAST;
内容的提问来源于stack exchange,提问作者dmcgrat4
相关产品推荐
相关产品推荐

