mysql 组 concat 成多个字段

Posted

技术标签:

【中文标题】mysql 组 concat 成多个字段【英文标题】:mysql group concat into multiple fields 【发布时间】:2017-04-02 14:04:28 【问题描述】:

我有一个食谱表,称为食谱。除了类别之外,还有配方的 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 行,这是一个很长的查询,我没有得到维度的名称,因为我需要另一个连接。

将所有维度分成字段并与类别名称连接的最佳方法是什么?我需要对此进行优化,因为这是针对每秒发生的一个食谱演示文稿,我不能在这里胡闹。我需要 whta 索引,这样会很快。

【问题讨论】:

“-”在哪里,我只用“_”我相信 一定是转录错误,从您将名称从斯洛文尼亚语更改为英语 - 已修复 顺便说一句,这个查询会导致语法错误 - 所以当你说“这有效”时,这并不完全正确 如果是我,我会重新开始,没有相关的子查询——但是没有所有相关的表、样本数据集和期望的结果,真的很难提供帮助。一旦我们有一个合理的查询,我们就可以返回并再次查看索引。 我会留下来重新开始。您的表结构似乎没有多大意义 【参考方案1】:

类似下面的内容,不确定我输入的表格/列名是否正确,但应该很容易调试:

  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

【讨论】:

以上是关于mysql 组 concat 成多个字段的主要内容,如果未能解决你的问题,请参考以下文章

实用sql函数group_conca我知道你想group_concat和count一起用,比如不同组合的人数?

mysql concat 用法

MySQL 对分组后的同类数据进行拼接字符串

mysql之 round()函数 , concat()函数

mysql之 round()函数 , concat()函数

MySQL CONCAT 多个字段与 IF 语句