Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何根据可以位于两列中任何一列的用户ID仅选择最近的记录?_Mysql_Unique_Messaging_Messages - Fatal编程技术网

Mysql 如何根据可以位于两列中任何一列的用户ID仅选择最近的记录?

Mysql 如何根据可以位于两列中任何一列的用户ID仅选择最近的记录?,mysql,unique,messaging,messages,Mysql,Unique,Messaging,Messages,我有一个messages表,它的结构有点像这样: from | to | date ----------------------------------- 1 | 3 | 2011-09-23 11:51:44 3 | 1 | 2011-09-23 11:56:29 3 | 2 | 2011-10-04 10:20:01 2 | 3 | 2011-10-05 07:48:00 SELECT MAX(date) FROM m

我有一个
messages
表,它的结构有点像这样:

from  |  to  |  date
-----------------------------------
1     |  3   |  2011-09-23 11:51:44
3     |  1   |  2011-09-23 11:56:29
3     |  2   |  2011-10-04 10:20:01
2     |  3   |  2011-10-05 07:48:00
SELECT MAX(date)
FROM messages
WHERE from = $userid
   OR to   = $userid
我想在我的网站上显示一个与Facebook的消息页面非常相似的消息页面,该页面显示用户与之对话的人的列表。无论对话的深度如何,页面仅显示每个人一次,以及与该特定人的对话中的最新消息,无论是发送的还是接收的

让我感到困惑的是,最近的消息可以发送也可以接收,这意味着用户的ID号可以在
from
to
列中。我不确定如何以我需要的方式对这两个列进行测试

我仍在学习如何编写更复杂的MySQL查询,虽然我觉得这是一个简单的使用
子查询的例子,但我似乎无法正确地使用它

解决方案 事实证明,这并不是一个很简单的案例。Widor花了一些时间来帮我解决这个问题,下面的查询似乎终于完成了任务。它还没有经过彻底测试,但到目前为止,它似乎运行良好:

SELECT m.*
FROM   messages m
       JOIN (SELECT Max(x.id)      AS `id`,
                    x.userid,
                    x.partnerid,
                    Max(x.mostrecent) AS `mostrecent`
             FROM  (SELECT Max(id)     `id`,
                           `from`         AS `userid`,
                           `to`           AS `partnerid`,
                           Max(`created`) AS `mostrecent`
                    FROM   messages
                    GROUP  BY `from`,
                              `to`
                    UNION
                    SELECT Max(id)     `id`,
                           `to`           AS `userid`,
                           `from`         AS `partnerid`,
                           Max(`created`) AS `mostrecent`
                    FROM   messages
                    GROUP  BY `to`,
                              `from`) AS `x`
             GROUP  BY x.`userid`,
                       x.`partnerid`) AS `y`
         ON y.id = m.id
WHERE  y.userid = $userid

我想你可能想要这样的东西:

from  |  to  |  date
-----------------------------------
1     |  3   |  2011-09-23 11:51:44
3     |  1   |  2011-09-23 11:56:29
3     |  2   |  2011-10-04 10:20:01
2     |  3   |  2011-10-05 07:48:00
SELECT MAX(date)
FROM messages
WHERE from = $userid
   OR to   = $userid

您将用实际值替换
$userid
,希望使用.:-)

听起来你想要的是:

SELECT MAX(date), * FROM messages WHERE to IN (
    SELECT DISTINCT to FROM messages WHERE from = :id
) GROUP BY to
UNION
SELECT MAX(date), * FROM messages WHERE from IN (
    SELECT DISTINCT from FROM messages WHERE to = :id
) GROUP BY from
ORDER BY 1

其中,
id
是用于用户id的参数。

重新编辑

我之前的回答(和这里的其他一些回答一样)没有考虑到你有两个以上的对话“伙伴”的情况,这在你的示例数据中不是这样,但我相信在现实生活中会是这样

请考虑在数据中有一个额外记录的情况:

1    |     4    | 2011-10-04 08:34:12
我的修订质询如下:

SELECT userid, partnerid, max(mostRecent) from (
    SELECT [from] as [userid], [to] as [partnerid], max([date]) as [mostrecent] FROM messages GROUP BY [from], [to]
    UNION 
    SELECT [to] as [userid], [from] as [partnerid],max([date]) as [mostrecent] FROM messages GROUP BY [to], [from]
) [x]
WHERE userid = ?
GROUP BY userid, partnerid
因此,我们内部的
联盟
为我们提供了一个包含
用户ID
以及
合作伙伴ID
的数据集,即他们正在与谁聊天。如果需要,可以将其单独创建为视图,以简化查询

外部
选择
然后为指定的
用户ID
与之聊天的每个“合作伙伴”检索一条记录,以及最近的日期


Max()

CREATE VIEW dataview AS 
(SELECT t1.from AS userid, t1.date FROM messages AS t1) 
UNION
(SELECT t2.to AS userid, t2.date FROM messages AS t2)

看看结果表,现在应该很容易查询您想要的内容了

这个问题没有错:-)您可以将表本身连接起来,在from=to上,除了标题中的感谢和标记之外,还可以计算不同的日期……您尝试了什么,结果如何?这是一个有点“为我做”的问题。@TomalakGeret'kal,我理解你的意思。问题是,我在很短的一段时间内很快尝试了几种不同的方法,当一些方法不起作用时,我不会特意记下来,所以我不记得我尝试过的所有方法。下一次我会更彻底。事实上,我刚刚意识到示例中不需要额外的数据
3
1
2
对话,因此应该返回2条记录。这是非常重要的一点,我完全忽略了这一点。你会和多个人交谈。只是让我觉得更复杂。我将尝试您的查询并让您知道它对我的作用。起初我没有意识到我必须将您的[]括号更改为``。无论如何,我成功地得到了返回结果,但我没有提到这一切中非常重要的一部分。我需要能够检索整行,而不仅仅是我们用来查找它们的那些列。我为忘记提及这一部分而道歉。哎呀,看起来有很多误读在发生——我使用的是SQl Server符号,而不是我的SQl!无论如何,我将编辑我的帖子,向您展示如何检索整行,但是您的表上有主键吗?看起来我可以在这里和那里添加一些*来提取所有列。但是有一个问题。由于某些原因,这不是检索最新消息。它正在找回最老的。