Php 使用order by和group by在同一表中使用两个外键发出
我需要在php中开发聊天应用程序,为此我创建了两个表,如用户表和消息表。每个用户的详细信息将存储在用户表中,每条消息将存储在消息表中。我已经完成了存储部分,它工作正常。现在我需要显示消息。所以根据我的要求 当任何用户登录到他的门户网站时,他/她将能够看到最新的消息用户列表。如果他想给任何其他用户发送消息,他只需单击其中的profile pic,消息面板就会打开。直到我完成了所有操作 但我的问题是我需要展示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,消息面板就会打开。直到我完成了所有操作 但我的问题是我需要展示 最新消息用户列表 在这我需要显示用户的名字,个人资料图片,最后一条消息,最后一条消息日期
- 最新消息用户列表
- 在这我需要显示用户的名字,个人资料图片,最后一条消息,最后一条消息日期
- 还有一个条件是,我需要先显示列表,就像最新消息用户一样
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排序我们需要按中位排序和分组是单独的操作是的,但我得到了旧的输出。无法获取预期输出请参阅如何获取每个组中的第一行或最后一行。使用我展示的分组解决方案。