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

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

最佳答案

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

要处理不确定的数字,可以使用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以获得第五个,

关于mysql - MySQL:将值串联在一起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17619813/

10-14 17:43