![](/img/trans.png)
[英]How to create multiple rows from conditions on columns in a single row in SQL
[英]Create columns from row value pairs in SQL
是否可以将多行汇总到列中,并将列名作为返回值之一而无需多个连接?
例子:
表: user
ID | 姓名 | |
---|---|---|
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 | 姓名 | 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.