【问题标题】:MySQL Inbox query returning double resultsMySQL收件箱查询返回双重结果
【发布时间】:2015-11-08 00:16:20
【问题描述】:

使用 PHP 和 MySQL,我正在创建一个收件箱消息系统,它可以工作,但它在某种意义上返回双精度数。收件箱应显示两个人之间的对话以及发送的最后一条消息。用户可以单击该最新消息并与用户聊天。现在收件箱显示用户 1 发送的最新消息,如果用户 1 向用户 2 发送消息,并且如果用户 2 向用户 1 发送消息,则显示最新消息。如果用户 1 或用户 2 互相发送消息,我只想显示他们中的任何一个发送的最后一条消息。这是我的查询,我想自己做,但是我的 SQL 技能有点迟钝。

这是我的消息表:

这是我的用户表:

最后,这里是查询:

SELECT m.body, m.createddate,m.recuserid,m.createduserid,
    FROM( SELECT MAX(createddate) as maxdate 
     from 

     messages 

     group by recuserid,createduserid
    ) c 
inner join messages m on m.createddate = c.maxdate 
inner join users u on u.userid = m.createduserid 

WHERE createduserid = 143 OR recuserid = 143

这是它返回的结果:

如您所见,它以任何方式返回涉及用户 143 的任何消息。我想要的结果是只返回第一行和第三行。

【问题讨论】:

  • 你得到了你想要的。 createduserid 为 143 的行,OR 其中 recuserid 为 143。
  • @xQbert 它返回第三个结果但不返回第一个结果(我自己发消息)
  • @MarcB 我意识到了这一点,但我该如何解决?
  • 删除 OR recuserID = 143... 并保留该组,现在我看到了您之后的内容...尽管我会返回两个 ID 并将它们用作加入条件的一部分。
  • 问题是您只查询子查询中的日期,而您应该查询日期和用户 ID,这样您就可以正确识别父记录。

标签: php mysql sms message message-queue


【解决方案1】:

我想这就是你所追求的:

SELECT m.`body`,
       MAX(m.`createddate`) AS maxcreateddate,
       m.`pairid`
FROM (SELECT `body`,
             `createddate`,
             CONCAT(`recuserid`,`createduserid`) as pairid
      FROM `messages`
      WHERE `recuserid`=143
    UNION
      SELECT `body`,
             `createddate`,
             CONCAT(`createduserid`,`recuserid`) as pairid
      FROM `messages`
      WHERE `createduserid`=143) as m
GROUP BY pairid;

有人可能会嘲笑我的性能,但它确实为您提供了您正在寻找的结果(仅第一行和第三行)。

希望对你有帮助;)

【讨论】:

  • 谢谢 :) 从未见过有人以这种方式使用 concat 真是太棒了
【解决方案2】:
SELECT m.body, m.createddate,m.recuserid,m.createduserid,
    FROM ( SELECT MAX(createddate) as Maxdate, recuserID, createduserId
           FROM MESSAGES 
           GROUP BY recuserid,createduserid) c 
INNER JOIN messages m 
   on m.createddate = c.Maxdate 
  and m.RecUserID = C.RecuserId
  and m.CreateduserId = C.CreatedUserId
INNER JOIN users u 
   on u.userid = m.createduserid 
WHERE createduserid = 143 

您拥有的 OR 语句是导致返回第二行的原因。正如@MarcB 在最初的评论中所说。

但是,由于日期/时间可能匹配,您应该返回分组的内容并将其添加到加入条件中......

也许您只想要用户发送或接收的最新消息....

SELECT m.body, m.createddate,m.recuserid,m.createduserid,
    FROM ( SELECT MAX(createddate) as Maxdate,  
           FROM MESSAGES
           where createdUserID =143 OR RecUserID = 143) c 
INNER JOIN messages m 
   on m.createddate = c.Maxdate 
INNER JOIN users u 
   on u.userid = m.createduserid 
WHERE createduserid = 143 

【讨论】:

  • 这有点用,但它没有返回最新消息而是返回第一条消息?
  • 你在追求什么?最旧的消息还是最新的消息?这应该为 recuserId 和 createduserId 的每个组合返回最新消息。
  • 因此,如果 A-->B 或 B-->A 或 A-->A,您希望只有 1 条记录返回任一用户发送的最新消息。但只有 1 个?如果是这样,那么为什么要评论“我想要的结果是只返回第一行和第三行。?”我很茫然,我不知道你的预期结果是什么。
  • 对不起,如果我以任何方式含糊不清,但是我正在寻找用户发送或接收的最新消息。第一行和第三行的意思是我在 OP 中发布的结果图片。所需的结果应该只是第 1 行和第 3 行,而不是第 2 行。如果您查看每条消息附加的时间,第 2 行和第 3 行都是同一个人之间的对话,但第 3 行的时间比第 2 行晚,所以它不应该显示 2 而只显示 3
  • 我很困惑...“最近的消息如何返回 2 个结果,除非它们是相同的日期/时间?这显然不是 1 和 3 的情况。所以你的预期结果're looking for don't match the English being used. 直到你弄清楚预期的结果,或者这里的英文问题我不知道该怎么办。
猜你喜欢
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多