php - sql GROUP_CONCAT 未显示所有帖子消息
问题描述
我有这张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
每个评论反应的表格(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
表示users表id,r_id
表示reaction id,comment_id
表示comment表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) 登录用户的反应 id。
解决方案
您在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
推荐阅读
- excel - 确定印刷成本的多重三条件语句
- reactjs - 使地图适合反应传单中的要素层边界
- testing - 基于 Azure Dev-Ops 查询的套件添加了 3 次项目
- sql - 可以选择离点表最近的点,但我还需要点名
- vuex - Vuex.js 侧边栏
- sql - 在 SQL Server 上将 Varchar 转换为日期时间
- json - mapper.readValue 不尊重 JSON 视图
- c# - 如何将 vb.net 属性转换为 c#
- ios - 如何在 Safari 和 Native 应用程序之间传递数据
- cmd - AutoHotKey 在 CMD 中键入“powercfg batteryreport”