在同一个表

时间:2017-02-07 06:19:21

标签: php mysql group-by foreign-keys sql-order-by

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

当任何用户登录他的门户时,他/她将能够看到最新的消息用户列表。如果他想要给任何其他用户发消息,他只需点击那里的个人资料图片就会打开一个消息面板.Untill在这里我完成了一切。

但我的问题是我需要显示

  • 最新消息用户列表,

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

  • 还有一个条件是我需要先显示最新消息用户的列表。

我已经尝试了很多方面,但我得到了第一条消息的用户列表我不希望我需要该用户的上一条消息

我的桌子是

用户表

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
-----------------------------------------

提前致谢

2 个答案:

答案 0 :(得分:1)

试试这种方式

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

答案 1 :(得分:0)

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

GROUP BY GREATEST(u.uid, u2.uid), LEAST(u.uid, u2.uid)

将此与SQL Select only rows with Max Value on a Column中的解决方案一起使用,以获取使用此分组找到的每个会话中的第一条或最后一条消息。

您还应该在u子句中为u2SELECT的列提供别名,以便您可以区分结果中的发件人和收件人信息。

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,
       ...