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 成多个字段的主要内容,如果未能解决你的问题,请参考以下文章