Mysql SQL多表查询

Mysql SQL多表查询,mysql,sql,Mysql,Sql,我有三种关系:菜谱(名称、描述)、配料(recipeName、num、val)和步骤(recipeName、num、val)。每个食谱将有一个或多个成分,以及一个或多个步骤。我正试图写一个查询,列出单一配方的成分和步骤。有了这个疑问 SELECT Recipes.name, Recipes.descr, Ingredients.num, Ingredients.val, Steps.num, Steps.val FROM Recipes LEFT OUTER JOIN Ingredients

我有三种关系:菜谱(名称、描述)、配料(recipeName、num、val)和步骤(recipeName、num、val)。每个食谱将有一个或多个成分,以及一个或多个步骤。我正试图写一个查询,列出单一配方的成分和步骤。有了这个疑问

SELECT Recipes.name, Recipes.descr, Ingredients.num, Ingredients.val, Steps.num, Steps.val
FROM Recipes 
LEFT OUTER JOIN Ingredients ON Recipes.id = Ingredients.recipeName  
LEFT OUTER JOIN Steps ON Recipes.id = Steps.recipeName;
这个查询就像一个叉积。因此,如果某些配方的配料值为1,ing-a和2,ing-b和步骤值为1,步骤c,步骤2,步骤d和步骤3,步骤e,我得到(顺序为recipe.name,recipe.descr,incoments.num,incoments.val,steps.num,steps.val)

是否有如下所示返回的查询(配方VAL、成分、步骤)


我刚刚看到问题发生了变化以下内容可能无效

您可以使用group concat执行此操作,如下所示:

SELECT
  Recipes.name, Recipes.descr,
  GROUP_CONCAT(CONCAT(Ingredients.num,' ',Ingredients.val) SEPARATOR ', ') AS Ingredients,
  GROUP_CONCAT(CONCAT(Steps.num,' ',Steps.val) SEPARATOR ', ') AS Steps
FROM Recipes 
LEFT OUTER JOIN Ingredients ON Recipes.id = Ingredients.recipeName  
LEFT OUTER JOIN Steps ON Recipes.id = Steps.recipeName;
GROUP BY Recipes.name, Recipes.descr
数据

DROP TABLE iF EXISTS Recipes;
DROP TABLE iF EXISTS Ingredients;
DROP TABLE iF EXISTS Steps;

CREATE TABLE Recipes
(id INT,
 name VARCHAR(100),
 descr VARCHAR(100));

CREATE TABLE Ingredients
(recipeName INT,
 num INT,
 val VARCHAR(100));

CREATE TABLE Steps
(recipeName INT,
 num INT,
 val VARCHAR(100)); 

INSERT INTO  Recipes VALUES (1, 'name', 'descr');

INSERT INTO Ingredients VALUES (1, 1, 'ing-a');
INSERT INTO Ingredients VALUES (1, 2, 'ing-b');
INSERT INTO Ingredients VALUES (1, 3, 'ing-c');

INSERT INTO Steps VALUES (1, 1, 'step-a');
INSERT INTO Steps VALUES (1, 2, 'step-b');
INSERT INTO Steps VALUES (1, 3, 'step-c');
解决方案

SELECT v1.display
  FROM (    SELECT Recipes.id AS sort_key, 1 AS seq, Recipes.name AS display
              FROM Recipes
            UNION ALL
            SELECT Recipes.id AS sort_key, 2 AS seq, Recipes.descr AS display
              FROM Recipes
            UNION ALL
            SELECT Ingredients.recipeName AS sort_key, 3 AS seq, CONCAT(Ingredients.num , ',' , Ingredients.val) AS display
              FROM Ingredients 
            UNION ALL
            SELECT Steps.recipeName AS sort_key, 4 AS seq, CONCAT(Steps.num , ',' , Steps.val) AS display
              FROM Steps ) v1
 ORDER BY v1.sort_key, v1.seq, v1.display; 
输出

***display***
name
descr
1,ing-a
2,ing-b
3,ing-c
1,step-a
2,step-b
3,step-c

要将它们作为不同的行放在一列中??应运行三个查询。如何在同一列中包含字符串列和整数列。。。你到底想要什么?很好,我打算这样重写。你不需要连接,你可以不用连接。谢谢@Hogan。是的,你说得对。我已编辑以排除连接:)一次后续操作。假设我们想要查找一个配方。例如,如何修改查询以返回Recipe.id=2的信息?为了执行查询,必须将条件添加到子查询中的每个SELECT中。谢谢。我昨晚很晚才睡,我明白了。我对SQL很陌生,你帮了我很大的忙。
SELECT v1.display
  FROM (    SELECT Recipes.id AS sort_key, 1 AS seq, Recipes.name AS display
              FROM Recipes
            UNION ALL
            SELECT Recipes.id AS sort_key, 2 AS seq, Recipes.descr AS display
              FROM Recipes
            UNION ALL
            SELECT Ingredients.recipeName AS sort_key, 3 AS seq, CONCAT(Ingredients.num , ',' , Ingredients.val) AS display
              FROM Ingredients 
            UNION ALL
            SELECT Steps.recipeName AS sort_key, 4 AS seq, CONCAT(Steps.num , ',' , Steps.val) AS display
              FROM Steps ) v1
 ORDER BY v1.sort_key, v1.seq, v1.display; 
***display***
name
descr
1,ing-a
2,ing-b
3,ing-c
1,step-a
2,step-b
3,step-c