MySQL:连接组中的值

时间:2013-07-12 16:41:16

标签: mysql

以下是我数据库的类别表中的数据

Category_Name     | SubCategory_Name
Category1         | Vegetarian
Category1         | Seafood
Category1         | Lamb
Category2         | Vegetarian 
Category2         | Chicken 
Category3         | Non-Vegetarian
Category3         | Vegetarian
Category3         | Chicken
Category4         | Lamb/Goat
Category4         | Seafood
Category5         | Vegetarian
Category5         | Non-Vegetarian 
Category6         | 
Category7         | Non-Vegetarian
Category7         | Vegetarian 

空白值表示“没有子类别”,但这些类别的结果应显示为仅提及类别名称的行

我想编写一个查询来显示如下结果:

Category_Name | SubCategory_Name 1 | SubCategory_Name 2 | SubCategoryName3 

1 个答案:

答案 0 :(得分:0)

查询文本需要提前“知道”,即要返回的列数。三个是每个Category_Name的最大SubCategory_Name数吗?

要处理不确定的数字,可以使用GROUP_CONCAT函数将它们组合成一个列,如下所示:

SELECT Category_Name
     , GROUP_CONCAT(DISTINCT SubCategory_Name ORDER BY SubCategory_Name) AS sc
  FROM mytable
 GROUP BY Category_Name

要将它们作为单独的列返回,则需要更多工作。我们首先需要对要返回的列数有一个“上限”。

我们可以先得到一个不同的Category_Name列表,然后为每个列表运行一个相关的子查询来检索与每个相关的第1,第2,第3等SubCategory_Name。

对于大型集合,这可能非常低效,但它对小集合执行合理,并且确实返回指定的结果集:

SELECT g.Category_Name
     , ( SELECT s1.SubCategory_Name
           FROM mytable s1
          WHERE s1.Category_Name = t.Category_Name
          GROUP BY s1.SubCategory_Name
          ORDER BY s1.SubCategory_Name
          LIMIT 0,1
       ) AS `SubCategory_Name 1`
     , ( SELECT s2.SubCategory_Name
           FROM mytable s2
          WHERE s2.Category_Name = t.Category_Name
          GROUP BY s2.SubCategory_Name
          ORDER BY s2.SubCategory_Name
          LIMIT 1,1
       ) AS `SubCategory_Name 2`
     , ( SELECT s3.SubCategory_Name
           FROM mytable s3
          WHERE s3.Category_Name = t.Category_Name
          GROUP BY s3.SubCategory_Name
          ORDER BY s3.SubCategory_Name
          LIMIT 2,1
       ) AS `SubCategory_Name 3`
  FROM ( SELECT t.Category_Name
           FROM mytable t 
          GROUP BY t.Category_Name
       ) g
 ORDER BY g.Category_Name

要返回第4个,第5个等子类别,您可以复制相关子查询并将其更改为LIMIT 3,1以获得第四个,LIMIT 4,1以获得第五个,