sql按用户分组HAVING time ASC ORDER BY time DESC

时间:2019-08-03 04:43:40

标签: php mysql sql

SQL

$sql = "SELECT DISTINCT from_user, messages.* FROM messages WHERE to_user = :user OR from_user = :usr Group BY from_user 
ORDER BY time DESC"; 

它可以工作,但是会显示用户消息from latter,然后按我的方式进行订购

$sql = "SELECT DISTINCT from_user, messages.* FROM messages WHERE to_user = :user OR from_user = :usr Group BY from_user HAVING time ASC 
ORDER BY time DESC"; 

HAVING time ASC ORDER BY time DESC"; ?

我想你们现在就得到了我,如何解决?

我的表结构

enter image description here

我需要selecttime ASC来自每个用户的最后一条消息,然后是ordertime DESC来自每个用户的最后一条消息 我尝试过

 $sql = "SELECT DISTINCT from_user, messages.* FROM messages  WHERE to_user = :user OR from_user = :usr ORDER BY time ASC Group BY from_user
ORDER BY time DESC";  

但不起作用

2 个答案:

答案 0 :(得分:0)

您的问题在having子句中。它与合计功能一起使用,可以对记录进行分组并检查记录上的某些条件。有关更多信息,您可以找到此link

要订购,只能通过order by子句完成。

此外,在查询中,您仅将group by用于1个字段,但是message.*将选择所有字段,这再次显示错误。

请参见上面的链接并重新构建查询。

  select m.*
  from messages  m
  where m.time = (select max(m2.time) from messages  m2 where m2.to_user = m.to_user and m2.from_user=m.from_user)  
  and m.to_user = :user OR m.from_user = :usr 
  order by time desc;

注意:您可以根据需要应用过滤器。这可能会有助于您的查询。

答案 1 :(得分:0)

您可以通过正确编写查询来解决此问题。正确的版本如下所示:

simmer()

或者,因为您似乎想要一行:

SELECT m.*
FROM messages m
WHERE :usr IN (m.to_user, m.from_user) AND
      m.time = (SELECT MAX(m2.time)
                FROM messages m2
                WHERE :usr IN (m2.to_user, m2.from_user)
               );