[英][SQL]How to delete all rows containing NULL value on the joined table column using LEFT JOIN and DELETE
[英]SQL : Left join with grouped joined rows
我有两个表:
users
包含我所有具有共同属性的用户metas
以一对多的关系保存所有动态属性(仅供参考,我无法将这些属性合并到users
表中,因为它们可以动态创建/删除)。ID | 姓名 | 电子邮件 |
---|---|---|
1 | 约翰 | j@d.com |
2 | 简 | a@d.com |
用户身份 | 姓名 | 价值 |
---|---|---|
1 | created_at | “2021-01-01” |
1 | 登录_at | “2021-01-01” |
2 | created_at | “2021-01-01” |
我想构建一个 SQL 查询,结果如下所示,所以我可以在用户元数据上有一些位置和顺序。
ID | 姓名 | 电子邮件 | created_at | 登录_at |
---|---|---|---|---|
1 | 约翰 | j@d.com | 2021-01-01 | 2021-01-01 |
2 | 简 | a@d.com | 2021-01-01 | 空值 |
我设法构建了一个结果,但只有一个元( 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
有什么建议 ?
您可以两次加入同一个表。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.