如何按列名分组并确保查询检索到最后一次更新

Posted

技术标签:

【中文标题】如何按列名分组并确保查询检索到最后一次更新【英文标题】:how to group by column name and ensure the query retrieves the last update 【发布时间】:2015-11-29 15:54:55 【问题描述】:

我目前正在使用 mysql 创建一个将返回以下内容的视图:

NAME | EMAIL | LAST_SEEN

abby | a@l.d | 2015-10-31 14:36:26
abby | a@l.d | 2015-11-28 13:30:37

然后我将GROUP BY name 应用到select query 并返回以下内容

 NAME | EMAIL | LAST_SEEN

 abby | a@l.d | 2015-10-31 14:36:26

我想知道如何修复此查询以使其返回以下内容:

NAME | EMAIL | LAST_SEEN

abby | a@l.d | 2015-11-28 13:30:37

实际代码如下:

CREATE VIEW v_user_last_seen
AS
SELECT concat_ws(' ', u.first_name, u.middle_name, u.last_name) AS user_name
    ,c.email
    ,l.in_when AS last_seen
FROM user AS u
INNER JOIN check_here_first AS c ON c.email = u.email
INNER JOIN log AS l ON l.u_id = c.username
GROUP BY user_name
ORDER BY user_name ASC

【问题讨论】:

dev.mysql.com/doc/refman/5.7/en/… Retrieving the last record in each group的可能重复 显示查询的实际代码 【参考方案1】:

只需使用 max(last_seen)

 select name, email, max(last_seen) 
 from  yourtable,
 group by name, email;

【讨论】:

【参考方案2】:

尝试在分组之前对表格进行排序,这应该适用于像这样的简单情况:

SELECT * 
FROM ( SELECT * 
       FROM `tablename` 
       ORDER BY `LAST_SEEN` DESC 
     ) temp
GROUP BY `name`

如果失败,您可以执行以下操作:

SELECT tmp1.*
FROM `tablename` tmp1
LEFT JOIN `tablename` tmp2
    ON (tmp1.`name` = tmp2.`name` 
        AND tmp1.`LAST_SEEN` < tmp2.`LAST_SEEN`)
WHERE tmp2.`name` IS NULL

这里的想法是将表的行与其自身匹配,其中匹配的值具有更高的值。对于那些不匹配的,我们将得到一个空值,因为我们使用LEFT JOIN。这些应该是组中最高的。

【讨论】:

以上是关于如何按列名分组并确保查询检索到最后一次更新的主要内容,如果未能解决你的问题,请参考以下文章

mysql实现查询分组查询最后一次的记录

记一次查询性能优化,原30s+,现0.5s~20s

ElasticsearchElasticsearch 缓存深度剖析:一次提高一种缓存的查询速度

Pandas:按第一次和最后一次出现填充每一行

Mongo查询返回每个节点的最后更新时间

Mongo查询返回每个节点的最后更新时间