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

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表的主键:

  1. 用户在reviewMovie页面提交评论+评分时,先写入rating表拿到生成的ratingID,再写入discussion表时填充该字段
  2. 用户单独提交评论时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 09:27:04