Php 使用order by和group by在同一表中使用两个外键发出

Php 使用order by和group by在同一表中使用两个外键发出,php,mysql,group-by,foreign-keys,sql-order-by,Php,Mysql,Group By,Foreign Keys,Sql Order By,我需要在php中开发聊天应用程序,为此我创建了两个表,如用户表和消息表。每个用户的详细信息将存储在用户表中,每条消息将存储在消息表中。我已经完成了存储部分,它工作正常。现在我需要显示消息。所以根据我的要求 当任何用户登录到他的门户网站时,他/她将能够看到最新的消息用户列表。如果他想给任何其他用户发送消息,他只需单击其中的profile pic,消息面板就会打开。直到我完成了所有操作 但我的问题是我需要展示 最新消息用户列表 在这我需要显示用户的名字,个人资料图片,最后一条消息,最后一条消息日期

我需要在php中开发聊天应用程序,为此我创建了两个表,如用户表和消息表。每个用户的详细信息将存储在用户表中,每条消息将存储在消息表中。我已经完成了存储部分,它工作正常。现在我需要显示消息。所以根据我的要求

当任何用户登录到他的门户网站时,他/她将能够看到最新的消息用户列表。如果他想给任何其他用户发送消息,他只需单击其中的profile pic,消息面板就会打开。直到我完成了所有操作

但我的问题是我需要展示

  • 最新消息用户列表

  • 在这我需要显示用户的名字,个人资料图片,最后一条消息,最后一条消息日期

  • 还有一个条件是,我需要先显示列表,就像最新消息用户一样

我尝试了很多方法,但是我得到了用户列表,上面有我不想要的第一条消息,我需要为那个用户提供最后一条消息

我的桌子是空的

用户表

uid  | firstname | email           | mobile
---------------------------------------------
1    | kumar     | kumar@gmail.com | 9876543210
----------------------------------------------
2    | jack      | jack@gmail.com  | 8876543216
----------------------------------------------
3    | rams      | rams@gmail.com  | 7876543215
----------------------------------------------
4    | devid     | devid@gmail.com | 9876543220
----------------------------------------------
5    | joe       | joe@gmail.com   | 8876543212
----------------------------------------------
消息表

mid| from_id  | to_id | message            | created_at
----------------------------------------------------------------
1  |   1      |    2  |  hello jack        | 2017-02-03 09:00:52
----------------------------------------------------------------  
2  |   2      |    1  |  hi kumar          | 2017-02-03 09:10:30
----------------------------------------------------------------
3  |   2      |    3  |  ram where are you | 2017-02-03 09:15:02
----------------------------------------------------------------
4  |   3      |    2  |  at home           | 2017-02-03 09:35:20
----------------------------------------------------------------
5  |   1      |    2  |  hello how are you | 2017-02-03 09:42:55
----------------------------------------------------------------
6  |   4      |    2  |  good morning      | 2017-02-03 09:50:45 
----------------------------------------------------------------
8  |   1      |    3  |  hi                | 2017-02-03 09:54:22 
----------------------------------------------------------------
7  |   3      |    1  |  hello kumar       | 2017-02-03 09:58:38 
----------------------------------------------------------------
例如,我已以kumar身份登录(uid=1)

预期产出:

firstname | message           | mid | uid
-----------------------------------------
rams      | hello kumar         | 7   | 3
-----------------------------------------
jack      | hello how are you   | 5   | 2
-----------------------------------------
我试过这样做:

SELECT DISTINCT
`u`.`firstname`,
`u`.`profile_photo`,
`u`.`uid`,
`u2`.`firstname`,
`u2`.`profile_photo`,
`u2`.`uid`,
`message`,
`messages`.`created_at`,
`messages`.`from_id`,
`messages`.`to_id`,
`messages`.`mid` 
FROM
`messages`
INNER JOIN
`users` AS `u` ON `u`.`uid` = `messages`.`from_id`
INNER JOIN
`users` AS `u2` ON `u2`.`uid` = `messages`.`to_id`
WHERE
(from_id = 1 OR to_id = 1)
GROUP BY
`u`.`uid`,
`u2`.`uid`
ORDER BY
`messages`.`mid` DESC
但是得到了这样的输出

firstname | message           | mid | uid
-----------------------------------------
jack      | hello jack        | 1   | 2
-----------------------------------------
rams      | hi                | 5   | 2
-----------------------------------------
提前谢谢

试试这个方法

SELECT DISTINCT `u`.`firstname`,`u`.`profile_photo`, `u`.`uid`, `u2`.`firstname`,`u2`.`profile_photo`,`u2`.`uid`, `message`,`messages`.`created_at`, `messages`.`from_id`,`messages`.`to_id`,`messages`.`mid` 
FROM `messages`
INNER JOIN `users` AS `u` ON `u`.`uid` = `messages`.`from_id` 
INNER JOIN `users` AS `u2` ON `u2`.`uid` = `messages`.`to_id` 
WHERE (from_id = 1 OR to_id = 1) 
GROUP BY `u`.`uid`, `u2`.`uid` 
ORDER BY `messages`.`created_at` DESC

如果消息位于相同的两个用户之间,则无论消息的方向如何,您似乎都希望将消息放在同一组中。为此,请将您的
分组方式更改为:

GROUP BY GREATEST(u.uid, u2.uid), LEAST(u.uid, u2.uid)
与中的解决方案一起使用,以获取使用此分组找到的每个对话中的第一条或最后一条消息

您还应该为
SELECT
子句中的
u
u2
列指定别名,以便在结果中区分发送方和接收方信息

SELECT u.firstname AS sender_name, u.profile_photo AS sender_photo, ...
或者,由于其中一个用户始终是kumar,您可以只选择关于另一个用户的信息:

SELECT IF(from_id = 1, u2.firstname, u1.firstname) AS firstname,
       IF(from_id = 1, u2.profile_photo, u1.profile_photo) AS profile_photo,
       ...

您应该对来自用户和发送给用户的消息进行单独的查询,然后将它们与UNION结合起来。关于编写查询以查找对话,有数百个这样的问题。出于某种原因,您不是第一个尝试将消息添加到其网站的人。您是否可以发送任何参考链接@BarmarSearch以便进行
[mysql]对话
:我已经检查了,但我没有得到解决方案如果您有此问题的解决方案,请发送该链接,而不是“[mysql]对话”谢谢你的更新,我尝试过这样做,但同样的问题我更新了我的答案,而不是按mid排序。你可以使用列中的created_,因为我可以在你的示例中看到,最后两列mid=7和mid=8没有按mid排序,而是按列中的created_排序`他的查询与此查询有什么区别?在
WHERE
子句中有不匹配的括号。按最大值(u.uid,u2.uid),最小值(u.uid,u2.uid)分组这里我们不需要按uid排序我们需要按中位排序和分组是单独的操作是的,但我得到了旧的输出。无法获取预期输出请参阅如何获取每个组中的第一行或最后一行。使用我展示的分组解决方案。