如何在mysql中按两列分组

  • 本文关键字:两列 mysql mysql sql pdo
  • 更新时间 :
  • 英文 :


我正在建立一个聊天网站,我有一个表,包含以下列,from_id,to_id,messages

from_id为发送消息用户的id,to_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相同时进行分组,我怎么能让它也走另一种方式呢

您可以使用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,你可以使用:

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);

最新更新