【问题标题】:Group by and get the last row分组并获取最后一行
【发布时间】:2012-09-11 11:45:15
【问题描述】:

当我使用的时候

SELECT * FROM reports WHERE staff='$username' GROUP BY taskid

在我的查询中,我得到了该组第一行的结果。

我需要添加什么才能从该组的最后一行获取结果?

最后一行意味着 id 大于该组中的另一行。

我尝试添加

ORDER BY id DESC 

ORDER BY id

但它没有返回预期的结果。

【问题讨论】:

  • 你为什么在这里使用 GROUP BY?
  • 我使用 group by 因为我知道它只会返回一行...这就是我想要的 :)
  • 您应该使用 LIMIT 子句来指定返回的行数。 GROUP BY 用于对您似乎不需要的组执行功能

标签: php mysql group-by


【解决方案1】:

您正在使用没有任何聚合函数的分组函数。您可能希望改为按顺序(查询中没有分组):

SELECT * FROM reports WHERE staff='$username' order BY taskid desc;

当您想对特定列使用聚合函数(例如获取平均行值或总和)等时,通常使用 Group By 函数。如果你没有使用任何聚合函数,那么使用 Group By 将不会做任何事情。

如果您只想从查询中获取一行,您可以添加一个限制子句,如下所示:

SELECT * FROM reports WHERE staff='$username' order BY taskid desc limit 1;

【讨论】:

    【解决方案2】:

    如果您想要每组的“最后”行,那么您需要指定定义唯一性的字段(即“第一行/最后一行”的含义),然后将这些行隔离在一个子查询。

    例如

    这将为您提供每个组的最大(id)

    SELECT taskid, max(id) as max_id FROM reports 
    WHERE staff ='$username' 
    GROUP BY taskid
    

    这会得到整行:

    select * from reports where id 
    in
    (
        SELECT max(id) as max_id FROM reports 
        WHERE staff='$username' 
        GROUP BY taskid
    ) x
    

    这当然假设 id 是唯一的并按升序分配,因此 max(id) 表示每个组的最后一行。

    或者,您可以使用连接重写它:

    select * from reports r
    inner join
    (
        SELECT max(id) as max_id FROM reports 
        WHERE staff='$username' 
        GROUP BY taskid
    ) x
    on r.id = x.max_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-14
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多