相反地​​合并

时间:2012-12-18 11:54:55

标签: mysql

嗨我有这个场景

我的表

 create table foo(
    id int,
    num int1,
    stage enum('a','b','c'),
    unique(id,stage)
);

以下是数据摘录

INSERT INTO `foo` (`id`, `num`, `stage`) VALUES
(1, 1, 'a'),
(1, 2, 'b'),
(1, 3, 'c'),
(2, 1, 'a'),
(2, 2, 'b'),
(2, 3, 'c'),
(3, 1, 'a'),
(3, 2, 'b'),
(4, 1, 'a');
  
    

表格注释

         

状态为c的id必须具有a的先前状态,b触发没有问题

  

将此查询为

Heidisql output

  

我使用与标量相关的子查询

进行区分
SELECT DISTINCT
id, IFNULL((
SELECT num
FROM foo f
WHERE f.id = foo.id AND f.stage = 'a'),'') `a`, IFNULL((
SELECT num
FROM foo f
WHERE f.id = foo.id AND f.stage = 'b'),'') `b`, IFNULL((
SELECT num
FROM foo f
WHERE f.id = foo.id AND f.stage = 'c'),'') `c`
FROM foo 
  
    

[底线]     我想要更好地做到这一点

  

感谢

2 个答案:

答案 0 :(得分:2)

SELECT   id,
         MAX(IF(stage = 'a', num, NULL)) AS `a`
         MAX(IF(stage = 'b', num, NULL)) AS `b`
         MAX(IF(stage = 'c', num, NULL)) AS `c`
FROM     foo
GROUP BY id

答案 1 :(得分:1)

试试这个:

SELECT id, IF(a=0, '', a) a, IF(b=0, '', b) b, IF(c=0, '', c) c
FROM (SELECT id, SUM(IF(stage = 'a', num, '')) a, 
            SUM(IF(stage = 'b', num, '')) b, SUM(IF(stage = 'c', num, '')) c
    FROM foo GROUP BY id) AS A