如何按列名分组并确保查询检索到最后一次更新
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
。这些应该是组中最高的。
【讨论】:
以上是关于如何按列名分组并确保查询检索到最后一次更新的主要内容,如果未能解决你的问题,请参考以下文章