0

这是我的数据库的类别表中的数据

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 
4

1 回答 1

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 的列表,然后对于其中的每一个,运行相关子查询以检索与每个相关联的第一个、第二个、第三个等 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获得第五个,

于 2013-07-12T16:54:00.890 回答