私はレシピと呼ばれるレシピテーブルを持っています。カテゴリー以外のレシピの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インデックスは、これが速くなるように必要です。以下のような
「 - 」、私は使用「_」私は – Jerry2
しなければならないと信じていますあなたがスロベニア語から英語に名前を変更したときから転記エラーになる - 固定 – Strawberry
ちなみに、このクエリの結果は構文エラーになります。つまり、「これはうまくいきます」と言えば、それはあまり正しくありません。 – Strawberry