php - 选择所有匹配的两个字段并用 mysql 按这两个字段分组

标签 php mysql select grouping

我有一个消息系统,它兼作消息系统和聊天系统,它们通过称为源的字段来区分。

我对消息部分进行了正确的排序和分组,但是在聊天部分中它没有相应地对这些部分进行分组,请参阅下面的 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 通常期望所有非分组依据字段都与某些聚合相关联,否则,它只会获取符合条件的记录的第一个实例。因此,如果您想在不同日期的对话中包含相同的人,您需要将“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 和接收者 ID(以及您希望从现在的别名“m2”引用中获得的任何其他数据)。

关于php - 选择所有匹配的两个字段并用 mysql 按这两个字段分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10350734/

相关文章:

php - 添加符号连接多个表

javascript - 如何使用 javascript 发布预览表的信息

javascript - 如何使用 AJAX 将 JavaScript 数组发送到 PHP?

mysql - 高级 SQL 选择查询/动态列

mysql - SQL 语法(红色节点)

php - 如何创建查询以获得正确的复数结果?

python - 使用 python 和 beautifulsoup 选择菜单从网页获取数据

php - 表单数据未存储在数据库中

php - 当查询为空时不回显任何内容

html - 大选择选项下拉列表中的文本切割