繁体   English   中英

从 SQL 中的行值对创建列

[英]Create columns from row value pairs in SQL

是否可以将多行汇总到列中,并将列名作为返回值之一而无需多个连接?

例子:

表: user

ID email 姓名
1 史蒂夫@gmail.com 史蒂夫
2 jan@gmail.com

表: meta

ID 用户身份 元密钥 元值
100 1 key_1 值_1
101 2 key_1 价值_2
102 1 key_2 值_3
103 2 key_2 value_4

期望的查询结果:

ID email 姓名 key_1 key_2
1 史蒂夫@gmail.com 史蒂夫 值_1 值_3
2 jan@gmail.com 一月 价值_2 value_4

目前,我使用多个左连接来生成此查询,但随着键列表的增长,最好避免使用越来越多的左连接。

SELECT u.*, meta1.meta_value AS 'key_1', meta2.meta_value AS 'key_2'
FROM users as u
LEFT JOIN meta as meta1 ON meta1.user_id = u.ID
LEFT JOIN meta as meta2 ON meta2.user_id = u.ID
WHERE 1=1
AND meta1.meta_key = 'key_1'
AND meta2.meta_key = 'key_2'

我很想能够做类似以下的事情,这在目前的形式中显然是无效的

SELECT u.*, meta.meta_value as meta.meta_key
FROM users as u
LEFT JOIN meta as meta ON meta.user_id = u.ID
WHERE 1=1
AND meta.meta_key IN ('key_1', 'key_2')

我目前的折衷方案是,如果键列表变大,我可以只返回一个连接键/值对的单元格。

作为参考,这是一个 WordPress 数据库。

您可以使用:

  • 用于提取特定键值的CASE语句
  • MAX聚合以删除您的CASE语句将生成的 NULL 值,因此对“用户”表中的其他选定列进行分组
SELECT u.*,
       MAX(CASE WHEN m.meta_key = 'key_1'
                THEN m.meta_value         END) AS key_1,
       MAX(CASE WHEN m.meta_key = 'key_2'
                THEN m.meta_value         END) AS key_2
FROM       user u
INNER JOIN meta m
        ON u.ID = m.user_id
GROUP BY u.ID,
         u.email,
         u.name

此处查看演示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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