2017-11-21 3 views
0

私はレシピ(name、descr)、成分(recipeName、num、val)とステップ(recipeName、num、val)の3つの関係を持っています。各レシピには、1つ以上の成分と1つ以上のステップがあります。私は単一のレシピの原料とステップをリストアップするクエリを書くことを試みています。このクエリではSQLマルチテーブルクエリ

このクエリはクロス製品と似ています。だから私の食材のレシピの値が1、ing-aと2、ing-bとstepsの値が1、step-c、2、step-dと3、step-eならば、recipe.descr、Ingredients.num、Ingredients.val、Steps.num、Steps.val)

name, descr, 1, ing-a, 1, step-c 
name, descr, 1, ing-a, 2, step-d 
name, descr, 1, ing-a, 3, step-e 
name, descr, 2, ing-b, 1, step-c 
name, descr, 2, ing-b, 2, step-d 
name, descr, 2, ing-b, 3, step-e 

はその後、その後(レシピヴァルス、食材、手順以下のように戻ってくるクエリがあります)

name 
descr 
1,ing-a 
2,ing-b 
1,step-c 
2,step-d 
3,step-e 
+1

異なる列として1列に入れたいですか? –

+0

3つのクエリを実行する必要があります。 –

+0

どのように同じ列に文字列と整数列を持たせることができますか?正確に何をしますか – Hogan

答えて

1

データ

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 
+0

非常にいいです、私はこのように書き直すつもりでした。あなたは結合を必要としません - それらなしでそれを行うことができます。 – Hogan

+0

ありがとう@Hogan。はい、あなたは正しいです。私は結合を除外するために編集しました:) – Ramesh

+0

これは動作します。ありがとう。 – jonathannah

0

質問が変更されました。以下は有効ではない可能性があります。

あなたはこのように、これを行うには、グループ連結を使用することができます。

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 
関連する問題