Mysql-Groupby在两个字段上,并将每个复合组的行限制为1

Mysql-Groupby在两个字段上,并将每个复合组的行限制为1,mysql,Mysql,我已经附上了我的数据表的图像。现在,此表存储用户发送给其他人和接收的所有消息。 我想显示一些类似facebook的个人消息,其中用户和其他用户之间的最新消息显示在列表中,当用户单击该消息时,将显示这两个用户之间的整个线程。我已经尝试了很多,但找不到一种方法来正确地显示它 此表将存储所有好友和非好友用户的消息。所以我只想得到那些给我发过信息的用户的信息列表 我不确定我的数据库设计是否正确?请帮助我的建议或帮助如何实现我的要求 id |发送方|接收方| id |已读|消息|父方| id |已发送|

我已经附上了我的数据表的图像。现在,此表存储用户发送给其他人和接收的所有消息。 我想显示一些类似facebook的个人消息,其中用户和其他用户之间的最新消息显示在列表中,当用户单击该消息时,将显示这两个用户之间的整个线程。我已经尝试了很多,但找不到一种方法来正确地显示它

此表将存储所有好友和非好友用户的消息。所以我只想得到那些给我发过信息的用户的信息列表

我不确定我的数据库设计是否正确?请帮助我的建议或帮助如何实现我的要求


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