MHF*_*MHF 7 mysql sql entity-attribute-value
我使用mysql,我在下面的表格中有两个表:
用户:
user_id - user_name - phoneUserMeta:
user_meta_id - user_id - meta_key - meta_value - meta_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 ...
Run Code Online (Sandbox Code Playgroud)
我需要获取所有注册的最新更改的用户信息(user_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
Run Code Online (Sandbox Code Playgroud)
这个操作的查询很复杂,我很困惑,请帮助我,
我使用了这个,但没有得到正确的结果:
"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";
Run Code Online (Sandbox Code Playgroud)
您可以使用以下内容:
SELECT `user`.*, user_meta.meta_key, user_meta.meta_value, user_meta.meta_date
FROM `user` INNER JOIN (
SELECT user_id, meta_key, MAX(meta_date) AS meta_date
FROM user_meta
GROUP BY user_id, meta_key
) meta_select ON `user`.user_id = meta_select.user_id
INNER JOIN user_meta ON meta_select.meta_key = user_meta.meta_key
AND meta_select.user_id = user_meta.user_id
AND meta_select.meta_date = user_meta.meta_date
WHERE `user`.user_id = 23
Run Code Online (Sandbox Code Playgroud)
虽然我强烈反对这种实施,但我不会试图改变主意.虽然有很多方法可以实现这一点,但我相信下面的查询将具有最低的性能损失(不使用聚合).
SELECT
user.*, meta.meta_key, meta.meta_value, meta.meta_date FROM user
LEFT JOIN
(
SELECT * FROM
(SELECT * FROM user_meta WHERE user_id = 23 ORDER BY meta_date DESC) sub
GROUP BY
sub.meta_key
) meta
ON
user.user_id = meta.user_id
ORDER BY
meta.meta_key;
Run Code Online (Sandbox Code Playgroud)
为了便于阅读,我将这样的查询格式化了.您可能会看到我正在使用2个嵌套的子查询.该要求来自以下事实:当您使用GROUP BY子句时,ORDER BY无效.因此,首先我们选择行并按日期desc对它们进行排序,之后我们进行分组.这样它就会保留排序顺序.
请在此处查看工作解决方案,另请注意,我在左窗格中的示例数据库创建脚本中添加了2个INDEX CREATE语句.随着数据库的增长,这些是最低限度的,以确保至少一些足够的性能.
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |