如何在select语句中动态放置多个if条件

时间:2014-06-27 20:24:10

标签: mysql

我有一个名为categories的表,如下所示。

mysql> select * from categories;
+-------------+--------------------+-----------------+---------------------+------+------+------+------+------+
| category_id | T1                 | T2              | T3                  | T4   | T5   | T6   | T7   | T8   |
+-------------+--------------------+-----------------+---------------------+------+------+------+------+------+
|           1 | Popcorn            | Regular Pack    | NULL                | NULL | NULL | NULL | NULL | NULL |
|           2 | Ice creams         | Cone            | KoolCool            | Choclate | NULL | NULL | NULL | NULL 
|           3 | SoftDrinks         | Pepsi           | Tin                 | Large | Lemon | NULL | NULL | NULL | 
|           3 | SoftDrinks         | Coke            | Tin                 | Large | Apple | Mix | NULL | NULL | 

我有T1栏中提到的不同类别的物品(爆米花,冰淇淋,软饮料) 每个类别最高可达T8级

通过以下查询,我支持T3级

SELECT t1,
       IF( t3 IS NULL, CONCAT('(', category_id, ')'), GROUP_CONCAT(CONCAT(t3,'(',category_id,')'))) AS consildated_Data
FROM categories
GROUP BY 1;

但是现在我需要支持T8级别

请有人告诉我如何实现这个目标

比方说,如果PopCorn在T3 Level结束,那么我需要它的T2 Level和在括号中的category_id。

+--------------------+-----------------+---------------------------------------------------------+
| t1                                  | consildated_Data                                        |
+-------------------------------------+---------------------------------------------------------+
| Popcorn                             | Regular Pack(1)                                                |
| Soft Drinks                         | Pepsi,Tin,Large,Lemon(3)     
| Soft Drinks                         | Coke,Tin,Large,Apple,Mix(3)                                  |
  Ice creams                             Cone,KoolCool,Choclate(2) 
--------------------+-----------------+---------------------------------------------------------+

这是我的sqlfiddle

http://sqlfiddle.com/#!2/0cfe8/1

1 个答案:

答案 0 :(得分:2)

我会像这样返回指定的结果集:

SELECT c.t1
     , CONCAT(
         TRIM(TRAILING ',' FROM 
           CONCAT_WS(','
             ,IFNULL(c.t2,'')
             ,IFNULL(c.t3,'')
             ,IFNULL(c.t4,'')
             ,IFNULL(c.t5,'')
             ,IFNULL(c.t6,'')
             ,IFNULL(c.t7,'')
             ,IFNULL(c.t8,'')
           )
         )  
         ,'('
         ,c.category_id
         ,')'
       ) AS consolidated_data
  FROM categories c

只需将所有t1t8与逗号分隔符连接在一起;从中删除所有尾随逗号,并在parens中添加category_id。

鉴于样本数据,GROUP BY子句不起作用,它会消除行,而您只能使用category_id(3)返回一行。