您可以使用GROUP_CONCAT
返回所有的成分和数量的清单。于是开始与现有的查询,你将其转换为:
-- Concatenate all your (ingredient, quantity)
SELECT
mealName,
GROUP_CONCAT(ingredient_and_quantity ORDER BY ingredient_and_quantity SEPARATOR '\t') AS ingredient_list
FROM
(SELECT
mealName, ingredient, quantity,
CONCAT(ingredient, ' ', quantity) AS ingredient_and_quantity
FROM
meals
JOIN mealTotal ON mealTotal.mealId = meals.mealId
JOIN ingredients ON ingredients.ingredientId = mealTotal.ingredientId
) AS q
ORDER BY
mealName;
这将会给你一个字符串与所有的成分和相应量。
mealName | ingredient_list
:-------- | :-----------------------------------------------------------------------
Apple Pie | Apple 1 Cane Sugar 1 Goat Butter 1 Tabantha Wheat 1
请注意,我已经改变了隐含JOIN
s到明确的。 (隐含的JOIN
s更难阅读且容易出错,很容易就会错过WHERE
上的一个链接条件,并且您会得到一个您预期不到的carteasian产品)。
您可以在dbfiddle here
检查了这一切。如果你想有成份不同列(ingredient_1, quantity_1, ingredient_2, quantity_2, ...)
,然后你可以从这个查询的变化开始的列表,并分解使用SUBSTRING_INDEX(str,delim,count)
归组数据:
-- Pivot
SELECT
mealName,
SUBSTRING_INDEX(SUBSTRING_INDEX(ingredients, ',', 1), ',', -1) AS ingredient_1,
SUBSTRING_INDEX(SUBSTRING_INDEX(ingredients, ',', 2), ',', -1) AS ingredient_2,
SUBSTRING_INDEX(SUBSTRING_INDEX(ingredients, ',', 3), ',', -1) AS ingredient_3,
SUBSTRING_INDEX(SUBSTRING_INDEX(ingredients, ',', 4), ',', -1) AS ingredient_4,
SUBSTRING_INDEX(SUBSTRING_INDEX(quantities, ',', 1), ',', -1) AS quantity_1,
SUBSTRING_INDEX(SUBSTRING_INDEX(quantities, ',', 2), ',', -1) AS quantity_2,
SUBSTRING_INDEX(SUBSTRING_INDEX(quantities, ',', 3), ',', -1) AS quantity_3,
SUBSTRING_INDEX(SUBSTRING_INDEX(quantities, ',', 4), ',', -1) AS quantity_4
FROM
(SELECT
mealName,
GROUP_CONCAT(ingredient ORDER BY ingredient SEPARATOR ',') AS ingredients,
GROUP_CONCAT(quantity ORDER BY ingredient SEPARATOR ',') AS quantities
FROM
(SELECT
mealName, ingredient, quantity
FROM
meals
JOIN mealTotal ON mealTotal.mealId = meals.mealId
JOIN ingredients ON ingredients.ingredientId = mealTotal.ingredientId
ORDER BY
mealName, ingredient
) AS q
) AS q2
ORDER BY
mealName;
这将使你喜欢的东西:
mealName | ingredient_1 | ingredient_2 | ingredient_3 | ingredient_4 | quantity_1 | quantity_2 | quantity_3 | quantity_4
:-------- | :----------- | :----------- | :----------- | :------------- | :--------- | :--------- | :--------- | :---------
Apple Pie | Apple | Cane Sugar | Goat Butter | Tabantha Wheat | 1.01 | 1.04 | 1.03 | 1.02
您可以在dbfiddle here
注意检查这,这不缩放(如果你需要10列,你必须用手工做的话),而一些值可能重复一次,因为STRING_INDEX
的工作方式。我不会推荐这种方法。
*从不*在'FROM'子句中使用逗号。 *总是*使用正确的,明确的'JOIN'语法。 –