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