2016-11-18 7 views
2

私はレシピと呼ばれるレシピテーブルを持っています。カテゴリー以外のレシピのIDRecipeフィールドと他のパラメーターがあります。カテゴリは多次元なので、1つのレシピと1つのレシピを接続する別のテーブルがあります。これはカテゴリテーブル(下の表1)と呼ばれます。以下に示すように、1つのレシピは複数のカテゴリで複数のカテゴリを持つことができます。だから私はまた、以下に、カテゴリおよび寸法を説明する別のテーブル(表2)を持つ:複数のフィールドにmysqlグループを連結

-- Table 1 
CREATE TABLE `recepti_kategorije` (
    `IDRecipe` int(11) NOT NULL, 
    `IDdimenzija` int(11) NOT NULL, 
    `IDKategorija` int(11) NOT NULL, 
    KEY `Iskanje` (`IDdimenzija`,`IDKategorija`,`IDRecipe`) USING BTREE, 
    KEY `izvlecek_recept` (`IDdimenzija`,`IDRecipe`), 
    KEY `IDRecipe` (`IDRecept`,`IDdimenzija`,`IDKategorija`) USING BTREE, 
    KEY `kategorija` (`IDKategorija`,`IDdimenzija`,`IDRecipe`) USING BTREE 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_slovenian_ci; 

INSERT INTO `recepti_kategorije` VALUES 
(1,1,1), 
(1,1,2), 
(1,2,3), 
(1,3,2); 

-- Table 2 
CREATE TABLE `recipes_dimensions` (
    `IDDimenzija` int(11) NOT NULL, 
    `IDKategorija` int(11) NOT NULL, 
    `Ime` char(50) COLLATE utf8_slovenian_ci NOT NULL, 
    KEY `IDDmenzija` (`IDDimenzija`,`IDKategorija`) USING BTREE, 
    KEY `IDKategorija` (`IDKategorija`,`IDDimenzija`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_slovenian_ci; 

INSERT INTO `recipes_dimensions` VALUES 
(1,1,'cheese'), 
(1,2,'eggs'), 
(1,3,'meat'), 
(1,4,'vegetables'), 
(2,1,'main dish'), 
(2,2,'sweet'), 
(2,3,'soup'), 
(3,1,'summer'), 
(3,2,'winter'); 

-- Table 3 
CREATE TABLE `recepti_dimenzije_glavne` (
    `IDDimenzija` int(11) NOT NULL, 
    `DimenzijaIme` char(50) COLLATE utf8_slovenian_ci DEFAULT NULL, 
    PRIMARY KEY (`IDDimenzija`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_slovenian_ci; 

INSERT INTO `recepti_dimenzije_glavne` VALUES 
(1,'ingredient'), 
(2,'type'), 
(3,'season'); 

表2は、各寸法や各カテゴリの伝説を見つけるためのキーテーブルです。

この例では、ID1のレシピにはチーズと卵があり、冬季にはスープです。

私のレシピのページでは、すべてのカテゴリ名とともに各ディメンションの名前を印刷するために、これをすべて取得する必要があります。

からディメンションの名前を取得するには、表3、[OK]を、ので、別のテーブルがある:

は今、私は必要なもののレシピのために同じ時間で私になるだろう、クエリでID = 1すべて次のような名前と連結されたディメンショングループ:

成分:チーズ、卵|タイプ:スープ|シーズン:冬

私はSELECTステートメントでそれぞれのクエリを実行しようとしましたが動作しますが、私は8つの選択クエリが必要です(例では3つしか書いていないので合計8個あります)。 :動作しますが、説明は、それは6-8行のように、それぞれの時間を検索して、それが長いクエリであると私は私ので、外寸法の名前を取得していないと言うので、それは何とか遅い

SELECT 
    r.ID 
    (
     SELECT 
      group_concat(ime SEPARATOR ', ') 
     FROM 
      recepti_kategorije rkat 
     JOIN recepti_dimenzije rd ON rd.IDKategorija = rkat.IDKategorija 
     AND rd.IDDimenzija = rkat.IDdimenzija 
     WHERE 
      rkat.IDRecipe = r.ID 
     AND rkat.IDDimenzija = 1 
     ORDER BY 
      ime ASC 
    ) AS ingredient, 
    (
     SELECT 
      group_concat(ime SEPARATOR ', ') 
     FROM 
      recepti_kategorije rkat 
     JOIN recepti_dimenzije rd ON rd.IDKategorija = rkat.IDKategorija 
     AND rd.IDDimenzija = rkat.IDdimenzija 
     WHERE 
      rkat.IDRecipe = r.ID 
     AND rkat.IDDimenzija = 2 
     ORDER BY 
      ime ASC 
    ) AS type, 
    (
     SELECT 
      group_concat(ime SEPARATOR ', ') 
     FROM 
      recepti_kategorije rkat 
     JOIN recepti_dimenzije rd ON rd.IDKategorija = rkat.IDKategorija 
     AND rd.IDDimenzija = rkat.IDdimenzija 
     WHERE 
      rkat.IDRecipe = r.ID 
     AND rkat.IDDimenzija = 3 
     ORDER BY 
      ime ASC 
    ) AS season 
FROM 
    recipes r 
WHERE 
    r.ID = 1 

別の結合が必要です。

すべての次元をフィールドに分割し、カテゴリ名と結びつける最適な方法は何ですか?私はこれを最適化する必要があります。これは1秒ごとに起こるレシピプレゼンテーションのためのものですから、私はここで欺くことはできません。そしてwhtaインデックスは、これが速くなるように必要です。以下のような

+0

「 - 」、私は使用「_」私は – Jerry2

+0

しなければならないと信じていますあなたがスロベニア語から英語に名前を変更したときから転記エラーになる - 固定 – Strawberry

+0

ちなみに、このクエリの結果は構文エラーになります。つまり、「これはうまくいきます」と言えば、それはあまり正しくありません。 – Strawberry

答えて

0

何か、私が正しいかではない、テーブル/カラム名を入力したが、デバッグが容易であるべきでないことを確認:され

SELECT c.ID,GROUP_CONCAT(CONCAT(d.DimenzijaIme,': ',c.imes) SEPARATOR ' | ') 
    FROM (
    SELECT 
     r.ID,rkat.IDDimenzija, 
     group_concat(rd.ime SEPARATOR ', ' ORDER BY rd.ime) AS imes 
    FROM recepti_kategorije rkat 
    JOIN recepti_dimenzije rd 
    ON rd.IDKategorija = rkat.IDKategorija 
    AND rd.IDDimenzija = rkat.IDdimenzija 
    INNER JOIN recipes r 
    ON r.ID=rkat.IDRecipe 
    GROUP BY r.ID,rkat.IDDimenzija) c 
    INNER JOIN recepti_dimenzije_glavne d 
    ON d.IDDimenzija=c.IDDimenzija 
    GROUP BY c.ID 
関連する問題