Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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
Php MySQL:选择每对的最后一行_Php_Mysql - Fatal编程技术网

Php MySQL:选择每对的最后一行

Php MySQL:选择每对的最后一行,php,mysql,Php,Mysql,我有一个小问题要解决,但我不能。我有以下聊天桌: 我正在研究一个PHP getInbox$uid方法,该方法返回每对用户和朋友的最后一条消息的数组。我尝试了一个按好友分组的SELECT查询,但它不完整 SELECT * FROM `chat` GROUP BY `friend` WHERE `user` = $uid OR `friend` = $uid 预期的结果是: id user friend msg date ----

我有一个小问题要解决,但我不能。我有以下聊天桌:

我正在研究一个PHP getInbox$uid方法,该方法返回每对用户和朋友的最后一条消息的数组。我尝试了一个按好友分组的SELECT查询,但它不完整

SELECT * FROM `chat`
GROUP BY `friend` 
WHERE `user` = $uid OR `friend` = $uid
预期的结果是:

id      user    friend      msg                     date
----------------------------------------------------------------------
3       2       1           I'm fine bro!           2014-07-04 02:30
5       3       1           Yo!                     2014-07-04 02:32
6       4       1           Wassup?!                2014-07-04 07:00
我将非常感谢你的帮助

SELECT c.* FROM
chat c
JOIN
(SELECT
    max(id) max_id,
    (CASE WHEN user < friend THEN user ELSE friend END) user_a,
    (CASE WHEN user < friend THEN friend ELSE user END) user_b
FROM chat
    GROUP BY user_a, user_b) t1 ON t1.max_id = c.id

case语句按升序选择user、friend。例如,1,2和2,1都将转换为1,2。有序对唯一标识对话。最后,为每个已订购的配对选择最新的id,并从聊天表中显示具有这些id的行。

如果您有某种线程或会话标识符,这将容易得多。一个简单的方法是将所有回复的父级设置为链中的第一个,然后选择每个链中的最后一个。所以我猜4,1,3是要标记的消息,然后5,3,1是标记的回复?我想了想,创建了一个对话表,并在每个聊天行上设置了一个外键。但是我想试着用一张桌子。它很有效!谢谢你能补充一些意见,或者解释一下你的逻辑吗?
SELECT c.* FROM
chat c
JOIN
(SELECT
    max(id) max_id,
    (CASE WHEN user < friend THEN user ELSE friend END) user_a,
    (CASE WHEN user < friend THEN friend ELSE user END) user_b
FROM chat
    GROUP BY user_a, user_b) t1 ON t1.max_id = c.id