【问题标题】:How to group by two columns in mysql如何在mysql中按两列分组
【发布时间】:2021-06-04 22:11:11
【问题描述】:

我正在建立一个聊天网站,我有一个包含以下列的表格,from_idto_idmessages

from_id 是聊天对象的idto_id 是聊天对象的id

现在我想获取所有聊天记录,但我也想以这样一种方式对它进行分组,如果 to_id 是我的 ID,它将按 from_id 分组,如果 from_id 是我的用户 ID ,然后它会按to_id分组,我试过这个SELECT * FROM chats WHERE from_id=:me || to_id=:me GROUP BY from_id, to_id,但它只在from_idto_id相同的情况下分组,我怎样才能让它也反过来呢

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。例如,您想对聚合做什么? “聚合”如何与“我想获得所有聊天记录”相匹配?非常混乱。

标签: mysql sql pdo


【解决方案1】:

聚合通常用于获取多行并将它们压缩为单行。这似乎不是你的本意

听起来您有 排序 问题,而不是 聚合 问题。如果您想按“其他”ID 对聊天进行排序,您可以使用:

select c.*
from chats c
where :me in (to_id, from_id)
order by (case when :me = to_id then from_id else to_id end);

【讨论】:

  • 我想group by 而不是order by
【解决方案2】:

您可以使用CASE 表达式来做到这一点:

SELECT CASE WHEN from_id = :me THEN to_id ELSE from_id END id,
       GROUP_CONCAT(messages) messages -- I added this as an aggregate function
FROM chats 
WHERE :me IN (from_id, to_id) 
GROUP BY id

但是如果你不需要任何聚合,那么你不应该使用GROUP BY,而是DISTINCT

SELECT DISTINCT CASE WHEN from_id = :me THEN to_id ELSE from_id END id
FROM chats 
WHERE :me IN (from_id, to_id) 

【讨论】:

  • 如何获取表的id
  • @EloikeDavid 哪个 id?表中没有列 ID。我使用 id 作为返回列的别名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 2018-12-08
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2022-11-21
相关资源
最近更新 更多