数据库是 MariaDB 10.3.25
我有 2 列相关:
用户 ID 和 LastUpdate
UserID 由 user@domain LastUpdate 是一个日期字段。
这是我的问题 - 我有当前的查询:
select a.UserID,
substring_index(a.UserID, '@', -1),
max(a.lastupdate)
from MyTable a
group by a.UserID
having max(a.lastupdate) < '2020-03-31'
这显示了一年多内未更新的所有用户和域。但是,我要考虑以下情况:
UserID LastUpdate
[email protected] 2020-08-16
[email protected] 2019-05-16
[email protected] 2021-05-05
使用当前查询,将捕获 [email protected],因此域 A.com 将被捕获为未使用,但用户 [email protected] 仍处于活动状态 - 我想做一个 Max(a.lastupdate ) 但将其分组, substring_index(a.UserID, '@', -1)
但也会吐出该域的所有用户。我敢肯定,答案让我眼前一亮……
看看是不是你想要的
最好的方法可能是以下。该解决方案利用了
GENERATED COLUMN
MariaDB >= 10.3(也在 MySQL >= 5.7 中)的功能——对于这样的查询非常方便——它还使查询更具可读性。下面的所有代码都可以在小提琴上找到:
然后是一些示例记录:
然后运行查询:
结果:
这适用于来自 dbfiddle.uk(一个很好的资源)的 MariaDB >= 10.3 的所有版本以及 MySQL >= 5.7 的版本。
它也适用于 MySQL 的 ONLY_FULL_GROUP_BY 设置!这非常重要 - 如果未设置该变量,则查询可能(并且将- 也将在此处和此处查看)返回错误结果(请参阅我对此处对该问题的其他答案的评论)。
举个例子,看看小提琴的底部,我已经指出了在这个(相对简单的)案例中另一个答案出现的问题 - 在一个复杂的陈述中,这个问题可能导致各种难以发现错误 - 警告购买者!
编辑:查看对问题的评论后(小提琴):
结果:
(主要问题由子查询处理,如其他答案中所见。这是一些附带问题。)
将有助于性能。
为什么不这样做
这样您就不必不断更改查询。