【问题标题】:Mysql count with GROUP_CONCAT while using join queryMysql 在使用连接查询时使用 GROUP_CONCAT 计数
【发布时间】:2022-09-26 16:49:01
【问题描述】:

我有一个聊天表和聊天反应表。每条聊天消息可以有很多反应,一个反应是一个文本,可以有很多。我正在尝试返回带有分组反应的消息以及使用特定反应的总次数。例如,

msg: hi with id 1 一共得到了三个反应。 1 LIKE AND 2 LOVES。我该如何退货?

这是我正在尝试的查询

SELECT c.id, c.msg, GROUP_CONCAT(cr.reaction) as reaction
FROM chats as c 
LEFT JOIN chat_reactions as cr on c.id = cr.chat_id 
GROUP BY c.id

我的结果看起来像这样。

[![在此处输入图像描述][1]][1]

如何添加带有反应的数字,或者我有更好和性能更好的选项? 请建议。

谢谢

  • 我会查找条件聚合。假设您有少量反应类型,这应该是一个很好的解决方案。
  • 你能添加一个例子吗
  • 您是否需要一列中的输出(1 喜欢 2 爱)或者更确切地说是单独的列。条件聚合适用于单个列。
  • 个人的,如果你能展示

标签: mysql sql


【解决方案1】:

首先计算后反应。然后汇总每个帖子。

select 
  c.id,
  c.msg,
  group_concat(concat(cr.reaction, '(', cnt, ')') 
               order by cr.reaction
               separator ', ') as reactions
from chats as c 
left join 
(
  select chat_id, reaction, count(*) as cnt
  from chat_reactions 
  group by chat_id, reaction
) cr on cr.chat_id = c.id
group by c.id, c.msg
order by c.id;

【讨论】:

  • 收到错误In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'db.c.id'; this is incompatible with sql_mode=only_full_group_by
  • @HkmSadek - 查看更新日期 - out select 需要 group by 语句。
  • 谢谢它的工作原理。您如何看待这种方法?有没有更好的方法来支持无限类型的反应?
  • @霍根:谢谢。我有group by c.id,然后错误地将其删除。 (仅 id 上的 group by 就足够了,因为 msg 在功能上依赖于主键列。)
  • 无限?如果消息字符串太长,它将被截断。但是,您可以更改长度限制。见dev.mysql.com/doc/refman/8.0/en/…
猜你喜欢
  • 2021-03-22
  • 2014-03-09
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多