以下是我数据库的类别表中的数据
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
答案 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
以获得第五个,