2017-07-29 66 views
0

我有一张餐桌,有几个ID与主表上的其他表相关联。Sequel Pro Combine多条线,其中只有1列是不同的,但其余是相同的

我还有另外一张桌子,里面的食物成分是用ID列出的,所以我不必一遍又一遍地输入食材。但是,当我运行以下搜索时,我会得到用餐名称,多次列出,因为每种成分都列在它自己的行中。我怎样才能得到它显示的名称,然后在同一行上的所有成分?

SELECT 
    mealName, ingredient, quantity 
FROM 
    meals, mealTotal, ingredients 
WHERE 
     mealTotal.mealId = meals.MealId 
    and mealTotal.ingredientId = ingredients.ingredientId 
ORDER BY 
    mealName; 

目前显示:

Apple Pie Apple 1 
Apple Pie Tabantha Wheat 1 
Apple Pie Goat Butter  1 
Apple Pie Cane Sugar 1 

我想什么它显示:

Apple Pie Apple 1 Tabantha Wheat 1  Goat Butter 1 Cane Sugar 1 
+0

*从不*在'FROM'子句中使用逗号。 *总是*使用正确的,明确的'JOIN'语法。 –

回答

0

您可以使用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的工作方式。我不会推荐这种方法。

+0

最终,我打算做的是使用查询将信息拖入程序。我是编程等新手,现在只是在C#的控制台窗口中工作。所以我正在考虑将这些成分和数字放入字典中?对于那个特定的餐点。然后,当我想要时,我将能够将该成分的成分和数量显示给用户。 希望能够更好地理解如何从数据库中查询它。 –

+0

如果您想要使用C#检索值并将它们放入字典中,*如果您刚刚问过*,您将得到正确的回应。实际上,你已经做了正确的事情,你只需要遍历你的记录集,并添加项目到你的字典。 – joanolo

相关问题