Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL按顺序选择分组_Mysql_Group By_Sql Order By - Fatal编程技术网

MySQL按顺序选择分组

MySQL按顺序选择分组,mysql,group-by,sql-order-by,Mysql,Group By,Sql Order By,我有一个mysql语句 SELECT * FROM tbl_messages WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' GROUP BY from_user_id ORDER BY date_sent DESC 它正在产生正确的结果,但是它们的顺序不正确 分组工作得很好,但它在组中显示的记录是第一个记录到DB中,但我希望在每个组中显示最新的记录 是否有办法显示每个组的最新记录 2011-12-19 12:16:

我有一个mysql语句

SELECT * 
FROM tbl_messages 
WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
GROUP BY from_user_id 
ORDER BY date_sent DESC
它正在产生正确的结果,但是它们的顺序不正确

分组工作得很好,但它在组中显示的记录是第一个记录到DB中,但我希望在每个组中显示最新的记录

是否有办法显示每个组的最新记录

2011-12-19 12:16:25 This is the first message
2011-12-19 12:18:20 This is the second message
2011-12-19 12:43:04 This is the third message
该组显示“这是第一条消息”,我希望显示“这是第三条消息”,因为这是最新的记录/消息


干杯

你的意思是这样的:

SELECT * FROM tbl_messages WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' GROUP BY from_user_id ORDER BY from_user_id, date_sent DESC
SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from

如果消息表的主键是自动递增的,并且所有消息本质上都是自动递增的,那么最大的数字就是最近的日期。。。但是,由于我不知道,我将基于发送的最大日期而不是最大SomeIDKey,但原理是相同的

select
      tm2.*
   from
      ( select tm1.from_user_id, 
               max( tm1.date_sent ) LatestMsgDate
           from tbl_messages tm1
           group by tm1.from_user_id ) MaxPerUser

      left join tbl_messages tm2
         on MaxPerUser.From_User_ID = tm2.From_User_ID
        AND MaxPerUser.LatestMsgDat = tm2.Date_Sent

   order by
      date_sent DESC

这可能有效,但不能保证:

SELECT * 
FROM
  ( SELECT *
    FROM tbl_messages 
    WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
    ORDER BY date_sent DESC
  ) tmp
GROUP BY from_user_id 
ORDER BY date_sent DESC
这应该起作用:

SELECT t.* 
FROM 
    tbl_messages AS t
  JOIN
    ( SELECT from_user_id 
           , MAX(date_sent) AS max_date_sent
      FROM tbl_messages 
      WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
      GROUP BY from_user_id 
    ) AS tg
    ON  (tg.from_user_id, tg.max_date_sent) = (t.from_user_id, t.date_sent)
ORDER BY t.date_sent DESC

通过将查询包装为GROUP BY,在订单之后执行GROUP BY,如下所示:

SELECT * FROM tbl_messages WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' GROUP BY from_user_id ORDER BY from_user_id, date_sent DESC
SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from

查询应该显示什么?如果您只需要这两列,例如ID和它的最新时间戳,这可能会起作用:。这比在一个有数百万行的大表上使用子查询要快。这似乎是可行的。只需稍加修改即可在GROUP BY之前添加tbl_消息,但看起来不错。谢谢谢谢拯救我的一天,在学校里我学到了更多关于subquerys的知识。。。我不记得这个伟大的查询。。。我的老师。。。旧内存如何在MaxPerUser中添加ORDER BY并在查询结束时添加GROUP BY。@MohammedAbrarAhmed,没有适用于内部MaxPerUser查询的ORDER BY。但是,如果您想要基于最新消息日期的外部结果,您可以按MaxPerUser.LatestMsgDate排序-如果您正考虑将最新消息浮动到顶部的话。即使我将ASC放在查询t中,它也会被删除。