php两个文件匹配对应字段,php – 选择所有匹配的两个字段,并使用mysql将这两个字段分组...

我有一个消息系统,它可以作为消息系统和聊天系统使用,这些系统由一个名为source的字段区分.

我有消息部分正确排序和分组,但是在聊天部分它没有相应地对这些进行分组,请参阅下面的SQL:

SELECT *

FROM messages

WHERE ( senderID = "1" OR receiverID = "1" )

AND source = "1"

GROUP BY receiverID, senderID

ORDER BY addedDate DESC LIMIT 10

所以我期待的结果是每场比赛只有一场,即每场比赛一场

但是由于某种原因我得到两个.

提前致谢

解决方法:

你可能每次聊天都得到两个答案,因为你会让每个人都处于两个位置

ChatID Sender Receiver

1 1 2

2 2 1

3 1 2

4 2 1

So, you'll have a record grouped by

Sender / Receiver

1 2 and

2 1

我认为你所寻找的是与会者截然不同的人,无论他们处于什么位置,上述都应该被认为是“一个人”.为了纠正这个问题,我会做类似……

select

PreQuery.*,

m2.Message,

m2.SenderID,

m2.ReceiverID

from

( SELECT

if( m.senderID < m.receiverID, m.senderID, m.receiverID ) as Person1,

if( m.senderID < m.receiverID, m.receiverID, m.senderID ) as Person2,

max( m.ID ) as LastMessageIDPerChat,

max( m.AddedDate ) as LastMessageDate

FROM

messages m

WHERE

m.Source = "1"

AND "1" IN ( SenderID, ReceiverID )

GROUP BY

Person1,

Person2

ORDER BY

m.AddedDate DESC

LIMIT 10 ) PreQuery

JOIN Messages m2

on PreQuery.LastMessageIDPerChat = m2.ID

这将确保较低的ID始终位于第一位置,并且无论哪个人的ID较高,总是处于第二位置以防止如上所述的错误重复.

另请注意…… GROUP BY通常期望所有非group by字段与某些聚合相关联,否则,它将只获取具有限定条件的记录的第一个实例.所以,如果你想在不同的日子里把同一个人包括在对话中,你就会想要将“AddedDate”添加到这个组中,这样就可以……

Person1 Person2 on 4/20

Person1 Person3 on 4/20

Person3 Person4 on 4/20

Person1 Person2 on 4/18

Person1 Person5 on 4/17

Person3 Person4 on 4/15

为了获得最后发送的人的状态,我必须对每个对话的成对人员进行查询,并获得该对话的最后一个ID.然后,接受并重新加入该ID上的消息(如果ID实际上是消息表的主键ID,则根据需要进行调整).从联接中,我可以获得对话的最后一条消息以及发件人ID和Receiver ID对于该事务的用户(以及您希望从现在的别名“m2”引用中获得的任何其他数据).

标签:php,mysql,select,grouping

来源: https://codeday.me/bug/20190630/1333924.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值