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

如何调整MySQL查询实现同一用户多条评论的合并展示?

问题描述

现有以下MySQL表结构及数据:

CREATE TABLE `person` (
  `id` int NOT NULL AUTO_INCREMENT,
  `reference` varchar(100) NOT NULL,
  `email` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

INSERT INTO `person` (`id`, `reference`, `email`) VALUES
(1, 'PK001',    'paulk@gmail.com');

CREATE TABLE `review` (
  `id` int NOT NULL AUTO_INCREMENT,
  `review_type` varchar(255) NOT NULL,
  `review_body` varchar(255) NOT NULL,
  `person_id` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

INSERT INTO `review` (`id`, `review_type`, `review_body`, `person_id`) VALUES
(1, 'Personality',  'He has a great personality!',  1),
(2, 'Skills',   'He has multiple skills!',  1);

运行如下PHP代码:

$sql = "SELECT * FROM person, review WHERE person.id = review.person_id;";
$result = $con->query($sql);

while($row = $result->fetch_assoc())  {
    echo $row['review_body'];
    echo ' | ';
    echo $row['review_body'];
    echo '<br>';
}

当前输出:

He has multiple skills! | He has multiple skills!
He has a great personality! | He has a great personality!

期望输出:

He has multiple skills! | He has a great personality!

需要调整MySQL查询语句实现上述期望效果。

解决方案

方法1:条件聚合(推荐)

利用CASE语句结合聚合函数,将同一用户的不同类型评论合并到同一行:

SELECT 
    MAX(CASE WHEN review_type = 'Skills' THEN review_body END) AS skills_review,
    MAX(CASE WHEN review_type = 'Personality' THEN review_body END) AS personality_review
FROM person
INNER JOIN review ON person.id = review.person_id
WHERE person.id = 1; -- 如需查询所有用户,可删除此WHERE条件

对应的PHP代码调整为:

$sql = "SELECT 
            MAX(CASE WHEN review_type = 'Skills' THEN review_body END) AS skills_review,
            MAX(CASE WHEN review_type = 'Personality' THEN review_body END) AS personality_review
        FROM person
        INNER JOIN review ON person.id = review.person_id
        WHERE person.id = 1;";
$result = $con->query($sql);

if($row = $result->fetch_assoc())  {
    echo $row['skills_review'];
    echo ' | ';
    echo $row['personality_review'];
    echo '<br>';
}

方法2:自连接

若评论类型固定,可通过自连接将不同类型的评论关联到同一行:

SELECT 
    r_skills.review_body AS skills_review,
    r_personality.review_body AS personality_review
FROM person p
INNER JOIN review r_skills ON p.id = r_skills.person_id AND r_skills.review_type = 'Skills'
INNER JOIN review r_personality ON p.id = r_personality.person_id AND r_personality.review_type = 'Personality'
WHERE p.id = 1;

PHP代码逻辑与方法1一致,直接输出两个字段即可。

内容的提问来源于stack exchange,提问作者michaelmcgurk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:01:29