我正在建立一个聊天网站,我有一个表,包含以下列,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_id
和to_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);