SQL :左连接分组连接行
SQL : Left join with grouped joined rows
我有两个 table:
users
包含我所有具有共同属性的用户
metas
以一对多关系保存所有动态属性,(仅供参考,我无法将这些属性合并到 users
table 中,因为它们可以动态创建/删除).
用户
id
name
email
1
John
j@d.com
2
Jane
a@d.com
元数据
user_id
name
value
1
created_at
"2021-01-01"
1
logged_at
"2021-01-01"
2
created_at
"2021-01-01"
问题
我想构建一个 SQL 查询结果如下所示,这样我就可以在用户元数据上找到一些位置和顺序。
id
name
email
created_at
logged_at
1
John
j@d.com
2021-01-01
2021-01-01
2
Jane
a@d.com
2021-01-01
NULL
进度
我设法建立了一个结果,但只有一个元(created_at
)而不是 logged_at
,因为我无法为同一用户分组许多元行。
SELECT users.*, CAST(JSON_UNQUOTE(value) AS DATE) as created_at
FROM users
LEFT JOIN metas on users.id = metas.user_id and metas.name = 'created_at'
ORDER BY created_at desc
约束条件
- 它应该在单个查询中完成,不能从代码端完成。
有什么建议吗?
您可以加入同一个 table 两次。
SELECT users.*,
CAST(JSON_UNQUOTE(m1.value) AS DATE) as created_at,
CAST(JSON_UNQUOTE(m2.value) AS DATE) as logged_at
FROM users
LEFT JOIN metas m1 on users.id = m1.user_id and m1.name = 'created_at'
LEFT JOIN metas m2 on users.id = m2.user_id and m2.name = 'logged_at'
ORDER BY created_at desc
使用枢轴
select *
from
(
select u.id,u.name as user_name,u.email,m.name as meta_name,m.value
from @tUsers as u
left join @tMetas as m on u.id=m.user_id
) as q
pivot
(
max(q.value) for q.meta_name in ([Created_At],[Logged_At])
) as pvt
order by pvt.id
我有两个 table:
users
包含我所有具有共同属性的用户metas
以一对多关系保存所有动态属性,(仅供参考,我无法将这些属性合并到users
table 中,因为它们可以动态创建/删除).
用户
id | name | |
---|---|---|
1 | John | j@d.com |
2 | Jane | a@d.com |
元数据
user_id | name | value |
---|---|---|
1 | created_at | "2021-01-01" |
1 | logged_at | "2021-01-01" |
2 | created_at | "2021-01-01" |
问题
我想构建一个 SQL 查询结果如下所示,这样我就可以在用户元数据上找到一些位置和顺序。
id | name | created_at | logged_at | |
---|---|---|---|---|
1 | John | j@d.com | 2021-01-01 | 2021-01-01 |
2 | Jane | a@d.com | 2021-01-01 | NULL |
进度
我设法建立了一个结果,但只有一个元(created_at
)而不是 logged_at
,因为我无法为同一用户分组许多元行。
SELECT users.*, CAST(JSON_UNQUOTE(value) AS DATE) as created_at
FROM users
LEFT JOIN metas on users.id = metas.user_id and metas.name = 'created_at'
ORDER BY created_at desc
约束条件
- 它应该在单个查询中完成,不能从代码端完成。
有什么建议吗?
您可以加入同一个 table 两次。
SELECT users.*,
CAST(JSON_UNQUOTE(m1.value) AS DATE) as created_at,
CAST(JSON_UNQUOTE(m2.value) AS DATE) as logged_at
FROM users
LEFT JOIN metas m1 on users.id = m1.user_id and m1.name = 'created_at'
LEFT JOIN metas m2 on users.id = m2.user_id and m2.name = 'logged_at'
ORDER BY created_at desc
使用枢轴
select *
from
(
select u.id,u.name as user_name,u.email,m.name as meta_name,m.value
from @tUsers as u
left join @tMetas as m on u.id=m.user_id
) as q
pivot
(
max(q.value) for q.meta_name in ([Created_At],[Logged_At])
) as pvt
order by pvt.id