【问题标题】:SQL : Left join with grouped joined rowsSQL:左连接与分组连接的行
【发布时间】:2021-12-27 17:02:26
【问题描述】:

我有两张桌子:

  • users 包含我所有具有共同属性的用户
  • metas 在一对多关系中保存所有动态属性,(仅供参考,我无法将这些属性合并到 users 表中,因为它们可以即时创建/删除)。

用户

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

约束

  • 应该在单个查询中完成,不能从代码端完成。

有什么建议吗?

【问题讨论】:

  • 为此使用PIVOT
  • 我不知道“枢轴”的概念。在 MySQL 中,没有枢轴机制,但可以使用 @hashed 番茄解决方案来解决。谢谢

标签: mysql sql left-join


【解决方案1】:

使用枢轴

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

【讨论】:

    【解决方案2】:

    你可以加入同一张桌子两次。

    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
    

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 2021-09-02
      • 1970-01-01
      • 2011-09-25
      • 2017-01-15
      • 2011-10-01
      • 1970-01-01
      • 2016-10-02
      • 2015-07-17
      相关资源
      最近更新 更多