mysql组连接到多个字段

时间:2016-11-18 16:27:19

标签: mysql one-to-many group-concat

我有一个食谱表,称为食谱。除了类别之外,还有IDRecipe字段和配方的其他参数。类别是多维的,所以我有另一个表,用一个配方连接一个到多个。它被称为类别表(下面的表1)。正如您将在下面看到的,一个配方可以在多个维度中具有多个类别。所以我有另一张表(表2),它描述了类别和尺寸,也在下面:

-- 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行,这是一个很长的查询,我没有得到维度的名称,因为我需要另一个连接。 / p>

将所有维度分成字段并与类别名称相结合的最佳方法是什么?我需要对此进行优化,因为这是针对每秒发生的一个食谱演示,我不能在这里愚弄。我需要whta索引,以便快速完成。

1 个答案:

答案 0 :(得分: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