这是我数据库类别表中的数据
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/