繁体   English   中英

SQL:左连接与分组连接的行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM