Mysql-Groupby在两个字段上,并将每个复合组的行限制为1
我已经附上了我的数据表的图像。现在,此表存储用户发送给其他人和接收的所有消息。 我想显示一些类似facebook的个人消息,其中用户和其他用户之间的最新消息显示在列表中,当用户单击该消息时,将显示这两个用户之间的整个线程。我已经尝试了很多,但找不到一种方法来正确地显示它 此表将存储所有好友和非好友用户的消息。所以我只想得到那些给我发过信息的用户的信息列表 我不确定我的数据库设计是否正确?请帮助我的建议或帮助如何实现我的要求Mysql-Groupby在两个字段上,并将每个复合组的行限制为1,mysql,Mysql,我已经附上了我的数据表的图像。现在,此表存储用户发送给其他人和接收的所有消息。 我想显示一些类似facebook的个人消息,其中用户和其他用户之间的最新消息显示在列表中,当用户单击该消息时,将显示这两个用户之间的整个线程。我已经尝试了很多,但找不到一种方法来正确地显示它 此表将存储所有好友和非好友用户的消息。所以我只想得到那些给我发过信息的用户的信息列表 我不确定我的数据库设计是否正确?请帮助我的建议或帮助如何实现我的要求 id |发送方|接收方| id |已读|消息|父方| id |已发送|
id |发送方|接收方| id |已读|消息|父方| id |已发送|日期|发送方|已删除|接收方||
1 | 5 | 4 | 0 |你好吗|0 |2012-08-20 17:33:54 |0 |0 2 | 4 | 5 | 0 | hiiiiii | 0 | 2012-08-20 17:35:02 | 0 | 0 3 | 5 | 4 | 0 |我在测试| 0 | 2012-08-20 17:35:02 | 0 | 0 4 | 4 | 5 | 0 |你好| 0 | 2012-08-20 17:35:33 | 0 | 0 5 | 5 | 4 | 0 |你好的回复| 0 | 2012-08-20 17:47:41 | 0 | 0 8 | 6 | 5 | 0 | | 0 | | 0 | | 2012-08-20 18:59:18 | 0 | | 0
9 | 5 | 6 | 0 |是的,伙计|0 | 2012-08-20 19:00:07 | 0 | 0你的问题不是很清楚你想做什么。似乎您需要一个查询,将每个发送者的最新消息返回给特定的给定接收者id 如果您没有访问SQL客户机程序的权限(如果您试图在PHP或Java中开发此程序,但没有SQL客户机程序),请获得访问SQL客户机的权限。没有这一点就很难发展 我们需要找出每个发件人最新发送的邮件,以及发件人已发送的邮件数量。这需要一个摘要查询。让我们假设message.id字段是一个自动递增字段,并且最新的消息具有最高的id
SELECT sender_id, MAX(id) id, COUNT(id) message_count
FROM message
WHERE receiver_id = 'receiver id to use'
AND is_sender_deleted = 0
AND is_receiver_deleted = 0
GROUP BY sender_id
这将为我们提供按发件人列出的最新邮件列表,以及来自该发件人的所有邮件的计数。看这把小提琴:
现在,让我们使用该摘要查询来选择消息文本和其他好的内容
SELECT m.sender_id, s.message_count, m.sent_date, m.message
FROM message m
JOIN (
SELECT sender_id, MAX(id) id, COUNT(id) message_count
FROM message
WHERE receiver_id = 'receiver id to use'
AND is_sender_deleted = 0
AND is_receiver_deleted = 0
GROUP BY sender_id
)s
ON m.id = s.id
ORDER BY m.sent_date desc, m.sender_id
此结果集为要使用的特定接收方id
,提供了一个列表,其中列出了来自每个发件人的邮件数量、最新邮件的文本和时间以及发件人的身份。这里有一个sqlfiddle:
一旦知道要使用的接收者id和要使用的发送者id,从特定发送者检索到特定接收者的所有消息应该是一个简单的查询
SELECT *
FROM message
WHERE sender_id = 'sender id to use'
AND receiver_id = 'receiver id to use'
AND is_sender_deleted = 0
AND is_receiver_deleted = 0
ORDER BY sent_date DESC
你的问题不是很清楚你想做什么。似乎您需要一个查询,将每个发送者的最新消息返回给特定的给定接收者id
如果您没有访问SQL客户机程序的权限(如果您试图在PHP或Java中开发此程序,但没有SQL客户机程序),请获得访问SQL客户机的权限。没有这一点就很难发展
我们需要找出每个发件人最新发送的邮件,以及发件人已发送的邮件数量。这需要一个摘要查询。让我们假设message.id字段是一个自动递增字段,并且最新的消息具有最高的id
SELECT sender_id, MAX(id) id, COUNT(id) message_count
FROM message
WHERE receiver_id = 'receiver id to use'
AND is_sender_deleted = 0
AND is_receiver_deleted = 0
GROUP BY sender_id
这将为我们提供按发件人列出的最新邮件列表,以及来自该发件人的所有邮件的计数。看这把小提琴:
现在,让我们使用该摘要查询来选择消息文本和其他好的内容
SELECT m.sender_id, s.message_count, m.sent_date, m.message
FROM message m
JOIN (
SELECT sender_id, MAX(id) id, COUNT(id) message_count
FROM message
WHERE receiver_id = 'receiver id to use'
AND is_sender_deleted = 0
AND is_receiver_deleted = 0
GROUP BY sender_id
)s
ON m.id = s.id
ORDER BY m.sent_date desc, m.sender_id
此结果集为要使用的特定接收方id
,提供了一个列表,其中列出了来自每个发件人的邮件数量、最新邮件的文本和时间以及发件人的身份。这里有一个sqlfiddle:
一旦知道要使用的接收者id和要使用的发送者id,从特定发送者检索到特定接收者的所有消息应该是一个简单的查询
SELECT *
FROM message
WHERE sender_id = 'sender id to use'
AND receiver_id = 'receiver id to use'
AND is_sender_deleted = 0
AND is_receiver_deleted = 0
ORDER BY sent_date DESC
是否检查用户是否已删除?欢迎使用。在您的问题中,显示您已尝试执行的操作很有帮助。请检查用户是否已被删除?欢迎使用。在你的问题中,展示你试图做的事情是很有帮助的。很抱歉提供了模糊的信息。谢谢你这么详细的帮助。假设有两个用户A,B。现在如果一条消息,他将是发送者,但如果他从B收到消息,他将是接收者。所以我不能按发送者id或接收者id分组。它不会给我A和B之间的所有消息。所以需要找到一种方法,我可以按发送者id和接收者id一起分组,就像复合字段一样。所以我刚刚添加了两个ID,这样可以根据需要获得唯一的记录。再次感谢您的帮助。您可以按发件人\u id、收件人\u id
分组,没有问题。对于信息含糊不清,非常抱歉。谢谢你这么详细的帮助。假设有两个用户A,B。现在如果一条消息,他将是发送者,但如果他从B收到消息,他将是接收者。所以我不能按发送者id或接收者id分组。它不会给我A和B之间的所有消息。所以需要找到一种方法,我可以按发送者id和接收者id一起分组,就像复合字段一样。所以我刚刚添加了两个ID,这样可以根据需要获得唯一的记录。再次感谢您的帮助。您可以按发件人id、收件人id进行分组,不会出现问题。
8 |6 |5 |0 |Hiii...Inx here|0 |2012-08-20 18:59:18 |0 |0
9 |5 |6 |0 |Yes mate....? |0 |2012-08-20 19:00:07 |0 |0
SELECT sender_id, MAX(id) id, COUNT(id) message_count
FROM message
WHERE receiver_id = 'receiver id to use'
AND is_sender_deleted = 0
AND is_receiver_deleted = 0
GROUP BY sender_id
SELECT m.sender_id, s.message_count, m.sent_date, m.message
FROM message m
JOIN (
SELECT sender_id, MAX(id) id, COUNT(id) message_count
FROM message
WHERE receiver_id = 'receiver id to use'
AND is_sender_deleted = 0
AND is_receiver_deleted = 0
GROUP BY sender_id
)s
ON m.id = s.id
ORDER BY m.sent_date desc, m.sender_id
SELECT *
FROM message
WHERE sender_id = 'sender id to use'
AND receiver_id = 'receiver id to use'
AND is_sender_deleted = 0
AND is_receiver_deleted = 0
ORDER BY sent_date DESC