Mysql 如何将表中的行中的变量放入列表中?(示例)(透视表?)

Mysql 如何将表中的行中的变量放入列表中?(示例)(透视表?),mysql,sql,pivot,Mysql,Sql,Pivot,我难以用语言解释我的问题。这就是为什么我的表格示例: 假设我想要一个结果表,如: user_id |data_a |data_b 1 |hello |world 我需要从表格“dataset”中提取它 data_id |user_id|data_type |data_data 1 |1 |data_a |hello 2 |1 |data_c |xxx 3 |2 |data_a |xxx 4

我难以用语言解释我的问题。这就是为什么我的表格示例:

假设我想要一个结果表,如:

user_id |data_a |data_b
1       |hello  |world
我需要从表格“dataset”中提取它

data_id |user_id|data_type  |data_data
1       |1      |data_a     |hello
2       |1      |data_c     |xxx
3       |2      |data_a     |xxx
4       |1      |data_b     |world
我做一些像

SELECT user_id , data_a, data_b
FROM dataset
WHERE ( data_type = data_a OR data_type = data_b )
AND user_id = 1

AND a = ( SELECT data_data WHERE data_type = data_a )
AND b = ( SELECT data_data WHERE data_type = data_b )
但是它不起作用。我知道我做错了,但我不知道该怎么做,也不知道它叫什么。我想买一张privot的桌子,但我不确定
这就是为什么描述如此模糊,我希望有人能理解。

这基本上是一个
PIVOT
,但MySQL没有
PIVOT
函数,因此您可以使用聚合函数和
CASE
语句复制它。因此,您的SQL将如下所示:

select user_id,
  max(case when data_type = 'data_a' then data_data end) data_a,
  max(case when data_type = 'data_b' then data_data end) data_b
from dataset
group by user_id

结果:

| USER_ID | DATA_A | DATA_B |
-----------------------------
|       1 |  hello |  world |
|       2 |    xxx | (null) |

这基本上是一个
PIVOT
,但MySQL没有
PIVOT
函数,因此您可以使用聚合函数和
CASE
语句复制它。因此,您的SQL将如下所示:

select user_id,
  max(case when data_type = 'data_a' then data_data end) data_a,
  max(case when data_type = 'data_b' then data_data end) data_b
from dataset
group by user_id

结果:

| USER_ID | DATA_A | DATA_B |
-----------------------------
|       1 |  hello |  world |
|       2 |    xxx | (null) |

可以使用附加两个结果的UNION:

SELECT user_id, 'data_a', data_a FROM t1 
UNION 
SELECT user_id, 'data_b', data_b FROM t1;
结果

+---------+--------+--------+
| user_id | data_a | data_a |
+---------+--------+--------+
|       1 | data_a | hello  |
|       1 | data_b | world  |
+---------+--------+--------+
和按用户id订购:

SELECT * 
FROM  
    (
     (select user_id, 'data_a' as data_type, data_a as data_data from t1) 
     UNION 
     (select user_id, 'data_b' as data_type, data_b as data_data from t1)
    ) as data 
ORDER by user_id;
结果是

 +---------+-----------+-----------+
 | user_id | data_type | data_data |
 +---------+-----------+-----------+
 |       1 | data_a    | hello     |
 |       1 | data_b    | world     |
 |       2 | data_a    | bye       |
 |       2 | data_b    | people    |
 +---------+-----------+-----------+

可以使用附加两个结果的UNION:

SELECT user_id, 'data_a', data_a FROM t1 
UNION 
SELECT user_id, 'data_b', data_b FROM t1;
结果

+---------+--------+--------+
| user_id | data_a | data_a |
+---------+--------+--------+
|       1 | data_a | hello  |
|       1 | data_b | world  |
+---------+--------+--------+
和按用户id订购:

SELECT * 
FROM  
    (
     (select user_id, 'data_a' as data_type, data_a as data_data from t1) 
     UNION 
     (select user_id, 'data_b' as data_type, data_b as data_data from t1)
    ) as data 
ORDER by user_id;
结果是

 +---------+-----------+-----------+
 | user_id | data_type | data_data |
 +---------+-----------+-----------+
 |       1 | data_a    | hello     |
 |       1 | data_b    | world     |
 |       2 | data_a    | bye       |
 |       2 | data_b    | people    |
 +---------+-----------+-----------+

添加订购以使其完全符合要求添加订购以使其完全符合要求