2016-11-18 54 views
2

我有一個食譜表,叫做食譜。 IDRecipe字段和配方的其他參數除類別外。分類是多維的,所以我有另一張桌子,用一種配方連接一對多。它被稱爲類別表(下面的表1)。正如你將在下面看到的,一個配方可以有多個維度的多個類別。所以我有一個描述類別和尺寸另一個表(表2),也低於:mysql組concat進入多個字段

-- 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有一個標籤:奶酪和1號蛋,冬季是湯。

現在在我的食譜頁面上,我需要將所有這些內容打印出來,以便將每個維度的名稱與所有類別名稱一起打印出來。

好了,還有另外一個表,表3,獲得尺寸的名字了:

現在我需要的是一個查詢,將讓我在同一時間對配方ID = 1的所有尺寸組與名稱連接,如:

成分:奶酪,雞蛋|類型:湯|我試圖在SELECT語句中爲它們中的每一個做一個查詢,它的工作原理,但我需要8選擇查詢(總共有8個維度,例如我只寫了3),我的選擇查詢是:

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 

這樣的作品,但由於解釋說,這是搜索每一次像6-8行,這是一個很長的查詢,我沒有得到的尺寸的名字,因爲我是在某種程度上慢需要另一個加入。

什麼是最佳方式將所有維分離到字段中並與類別名稱進行連接?我需要對此進行優化,因爲這是每秒發生一次的配方演示,我不能在這裏玩弄。我需要這些索引以便快速。

+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