1

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

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

user_id |data_a |data_b
1       |hello  |world

我需要以这种形式将其从表“数据集”中提取出来

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 表,但我不确定这就是为什么描述如此模糊,我希望有人能理解。

4

2 回答 2

4

这基本上是一个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

请参阅带有演示的 SQL Fiddle

结果:

| USER_ID | DATA_A | DATA_B |
-----------------------------
|       1 |  hello |  world |
|       2 |    xxx | (null) |
于 2012-11-19T19:15:20.587 回答
1

您可以使用 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  |
+---------+--------+--------+

通过 user_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    |
 +---------+-----------+-----------+
于 2012-11-19T19:26:53.557 回答