我正在使用mysql,我有两个表,格式如下:
用户:
用户名-用户名-电话
用户元:
user\u meta\u id-user\u id-meta\u key-meta\u value-meta\u date
我有如下记录:
user_id: 23
meta_key: gender
meta_value: male
meta_date: 1534533650
user_id: 23
meta_key: city
meta_value: london
meta_date: 1534533650
user_id: 23
meta_key: name
meta_value: jack
meta_date: 1534533650
user_id: 25
meta_key: name
meta_value: Jamie
meta_date: 1534593881
user_id: 25
meta_key: gender
meta_value: male
meta_date: 1534593881
user_id: 23
meta_key: gender
meta_value: female
meta_date: 1534595971
user_id: 23
meta_key: city
meta_value: liverpool
meta_date: 1534595971
And ...
我需要获取所有注册了最新更改的用户信息(user\u id=23),例如:
user_id: 23
meta_key: name
meta_value: Jamie
meta_date: 1534533650
user_id: 23
meta_key: city
meta_value: liverpool
meta_date: 1534595971
user_id: 23
meta_key: gender
meta_value: female
meta_date: 1534595971
这个操作的查询很复杂,我很困惑,请帮帮我,
我使用了这个,但没有得到正确的结果:
"SELECT kmu.*
FROM user_meta kmu
INNER JOIN
(SELECT `meta_key`, `meta_value`, MAX(`meta_date`) AS MaxDateTime
FROM user_meta
GROUP BY meta_key) groupedtt
ON user_id=:id
AND kmu.meta_key = groupedtt.meta_key
AND kmu.meta_date = groupedtt.MaxDateTime";
3条答案
按热度按时间mxg2im7a1#
您可以使用以下选项:
demo:https://www.db-fiddle.com/f/euqvgnw6pgucg495yi9dta/1
eivgtgni2#
我想提出一个基于行数函数的解决方案。该解决方案已广泛应用于其他数据库中。例如,看这里。但是您的mysql版本不支持row\u number函数,我使用了这里描述的模拟。要查看我的解决方案,请单击此处。
jvlzgdj93#
虽然我强烈反对这种做法,但我不会改变你的想法。尽管有很多方法可以实现这一点,但我相信下面的查询的性能损失最小(不使用聚合)。
为了便于阅读,我这样格式化了查询。您可能会看到我使用了两个嵌套的子查询。这个要求来自这样一个事实:当您使用GROUPBY子句时,ORDERBY不起作用。因此,我们首先选择行并按date desc排序,然后分组。这样它就保留了排序顺序。
请参阅这里的工作解决方案,还请注意,我在左窗格中的示例数据库创建脚本中添加了2个index create语句。随着数据库的增长,这些都是最低限度的,以确保至少有一些足够的性能。