我有这个comments表来存储每个帖子的所有评论
comment_id comment_message posts_id u_id created
=============================================================
46 comments.... 2 6 1559376498
47 comments.... 2 6 1559376502
48 comments.... 2 6 1559376598和每个注释的comments_like表reaction (r_id)
cl_id comment_id posts_id u_id r_id created
=============================================================
42 46 2 6 6 1559376598
43 47 2 6 2 1559376598
44 48 2 6 8 1559376598
45 46 2 1 2 1559376598注: posts_id表示posts表id,u_id表示用户表id,r_id表示reaction id,comment_id表示注释表id。
现在,,,我想得到一个特定ID的所有注释,其中包含一个反应id的和,这个反应id是由日志记录的用户提供的。
为此,我使用以下SQL查询,但它没有显示我的预期结果:
$query = $this->_db->_pdo->prepare("
SELECT c.*, u.u_id, u.full_name, cl.r_id, GROUP_CONCAT(cl.r_id ORDER BY cl.u_id) AS r_id
FROM comments AS c
LEFT JOIN users AS u ON c.u_id = u.u_id
LEFT JOIN comments_like AS cl ON cl.comment_id = c.comment_id
WHERE c.posts_id = '$post_id'
ORDER BY c.comment_id "); 这个查询的输出应该是
( 1)具体帖子id ($post_id)的所有评论;
2)反应id的列表
3)登录用户的反应标识。
发布于 2019-06-01 09:00:51
查询中缺少一个GROUP BY子句,因此它将所有注释分组到一行;您需要按c.comment_id分组。这应该会给你你想要的结果:
SELECT c.*, u.u_id, u.full_name, cl.r_id,
GROUP_CONCAT(cl.r_id ORDER BY cl.u_id) AS r_id
FROM comments AS c
LEFT JOIN users AS u ON c.u_id = u.u_id
LEFT JOIN comments_like AS cl ON cl.comment_id = c.comment_id
WHERE c.posts_id = 2
GROUP BY c.comment_id
ORDER BY c.comment_id输出:
comment_id comment_message posts_id u_id created u_id full_name r_id
46 comments.... 2 6 1559376498 6 Bill Jones 2,6
47 comments.... 2 6 1559376502 6 Bill Jones 2
48 comments.... 2 6 1559376598 6 Bill Jones 8发布于 2019-06-01 10:32:57
您似乎也想要一个特定用户的反应id。如果是的话:
SELECT c.*, u.u_id, u.full_name,
MAX(ASE WHEN cl.u_id = ? THEN cl.r_id END) as specific_user_reaction,
GROUP_CONCAT(cl.r_id ORDER BY cl.u_id) AS r_id
FROM comments c LEFT JOIN
users u
ON c.u_id = u.u_id LEFT JOIN
comments_like cl
ON cl.comment_id = c.comment_id
WHERE c.posts_id = ?
GROUP BY c.comment_id, u.u_id, u.full_name
ORDER BY c.comment_id;?是用于参数的。这就是如何将值传递给准备好的语句(而不是咀嚼查询字符串)。
第一个?是为您想要的用户准备的。第二个是您想要的帖子(原始代码中的$post_id)。如果您需要了解有关传递参数的更多信息,可以查看准备好的语句上的文档。
https://stackoverflow.com/questions/56405176
复制相似问题