最后的值使用GROUP BY

时间:2019-01-27 12:37:43

标签: mysql sql

我需要从can_id等于的表中获取最后一个值。
所以我尝试了这个SQL查询

SELECT com.text, com.can_id 
FROM (SELECT * FROM comments ORDER BY id DESC) as com 
GROUP BY com.can_id

但是,如果我在第一个选择中更改ASC / DESC,则第二个选择将仅进行分组而不进行排序,并使用第一个id取值
此选择将像查询中的左联接一样使用。

示例:
enter image description here

我需要获取com.text,其值为“ text2”(最后)

3 个答案:

答案 0 :(得分:1)

如果您使用的是MySql 8,则可以使用row_number

df['sum_rating'] = df['rating'].apply(sum)

如果您使用的是MySql 5.6+,则可以(ab)使用group_concat

SELECT com.text, com.can_id 
FROM (SELECT comments.*,
             row_number() over (partition by can_id order by id desc) rn
      FROM   comments) as com 
WHERE rn = 1;

答案 1 :(得分:0)

内部select中的order by子句是多余的,因为它被用作表,并且关系数据库中的表本质上是无序的。
虽然其他数据库(例如SQL Server)会将其视为错误,但我猜MySql只会忽略它。

我认为您正在寻找这样的东西:

SELECT text, can_id
FROM comments
ORDER BY id DESC
LIMIT 1

通过这种方式,您可以获得与最高ID值相关联的文本和can_id。

答案 2 :(得分:0)

在任何版本的MySQL中,以下功能均适用:

SELECT c.*
FROM comments c
WHERE c.id = (SELECT MAX(c2.id)
              FROM comments c2
              WHERE c2.can_id = c.can_id
             );

使用comments(can_id, id)上的索引,这也应该具有最佳性能。

这比group by方法更好,因为它可以利用索引,并且不受中间字符串长度的某些内部限制的限制。

row_number()相比,它应该具有更好的性能,因为它不会为每行分配行号,只有这样才能过滤掉内容。