MySQL 如何对特定字段进行 GROUP_CONCAT?

Posted

技术标签:

【中文标题】MySQL 如何对特定字段进行 GROUP_CONCAT?【英文标题】:MySQL How to GROUP_CONCAT a specific field? 【发布时间】:2011-09-04 00:30:38 【问题描述】:

我有一张带有本地化字符串的表格和一张通过组合和引用表格Strings 中的idString 来创建带有值的标签的表格。在底部您可以找到一个 mysql 脚本来创建所有这些数据。

字符串

idString  SE             EN
--------------------------------
3         Färg           Color
4         Svart          <null>
5         Röd            Red
6         Nokia          <null>
8         Mobiltelefon   Cell phone
9         Produkt märke  Brand
11        Typ            Type

TABLE: ItemData
idItem  idTag  idValue
--------------------------------
1       9      6      
1       3      5      
1       3      4      
1       11     8       

我发出这个 SQL 语句(随意提出任何优化建议)来查找表字符串中的 idTag 和 idValue 并检索它们的文本值。

SELECT d.*,
       IFNULL(sTag.en,sTag.se) sTag,
       IFNULL(sValue.en,sValue.se) sValue
  FROM itemdata d
  JOIN strings sTag ON idTag = sTag.idString
  JOIN strings sValue ON idValue = sValue.idString
 WHERE d.idItem = 1
ORDER BY sTag

如果没有定义任何内容(null),IFNULL 让我可以选择首选语言和默认语言。我最终得到了这个结果。

idItem  idTag  idValue  sTag    sValue
------------------------------------------
1       9      6        Brand   Nokia
1       3      5        Color   Red
1       3      4        Color   Svart
1       11     8        Type    Cell phone

问题

正如您在上面的结果中看到的,有两个名为 Color 的标签(具有不同的值)。 我想做的是将标签颜色的 sValues 连接到一个标签中,如下所示:

idItem  idTag  idValue  sTag    sValue
------------------------------------------
1       9      6        Brand   Nokia
1       3      5        Color   Red,Svart
1       11     8        Type    Cell phone

我一直在查看 GROUP_CONCAT,但它似乎只是合并了一整列。

MySQL 测试数据库创建

-- MySQL Administrator dump 1.4
--
-- ------------------------------------------------------
-- Server version   5.1.47-community

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

--
-- Create schema test
--

CREATE DATABASE IF NOT EXISTS test;
USE test;

--
-- Definition of table `itemdata`
--

DROP TABLE IF EXISTS `itemdata`;
CREATE TABLE `itemdata` (
  `idItem` int(10) unsigned NOT NULL,
  `idTag` int(10) unsigned NOT NULL,
  `idValue` int(10) unsigned NOT NULL,
  KEY `iPrimary` (`idItem`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='All item tags';

--
-- Dumping data for table `itemdata`
--

/*!40000 ALTER TABLE `itemdata` DISABLE KEYS */;
INSERT INTO `itemdata` (`idItem`,`idTag`,`idValue`) VALUES 
 (1,3,5),
 (1,9,6),
 (1,11,8),
 (2,3,4),
 (2,9,7),
 (2,11,8),
 (1,3,4);
/*!40000 ALTER TABLE `itemdata` ENABLE KEYS */;

--
-- Definition of table `strings`
--

DROP TABLE IF EXISTS `strings`;
CREATE TABLE `strings` (
  `idString` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `SE` varchar(45) DEFAULT NULL,
  `EN` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`idString`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='International strings';

--
-- Dumping data for table `strings`
--

/*!40000 ALTER TABLE `strings` DISABLE KEYS */;
INSERT INTO `strings` (`idString`,`SE`,`EN`) VALUES 
 (1,'Svenska',NULL),
 (2,NULL,'English'),
 (3,'Färg','Color'),
 (4,'Svart',NULL),
 (5,'Röd','Red'),
 (6,'Nokia',NULL),
 (7,'Samsung',NULL),
 (8,'Mobiltelefon','Cell phone'),
 (9,'Produkt märke','Brand'),
 (10,'Språk','Language'),
 (11,'Typ','Type');
/*!40000 ALTER TABLE `strings` ENABLE KEYS */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

【问题讨论】:

【参考方案1】:

我没有测试过这个:

SELECT d.idItem, 
       d.idTag,
       IFNULL(sTag.en,sTag.se) sTag,
       GROUP_CONCAT(IFNULL(sValue.en,sValue.se)) sValue
  FROM itemdata d
  JOIN strings sTag ON idTag = sTag.idString
  JOIN strings sValue ON idValue = sValue.idString
 WHERE d.idItem = 1
 GROUP BY d.idItem, d.idTag, IFNULL(sTag.en,sTag.se)
 ORDER BY sTag

【讨论】:

以上是关于MySQL 如何对特定字段进行 GROUP_CONCAT?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mySQL 中对动态生成的特定顺序进行排序?

如何按 C# 中的特定字段对对象列表进行排序?

如何对数组中的特定字段进行分组?

MongoDB:如何对 MySQL 字段关键字等结果中的记录进行排序 [重复]

MongoDB:如何对 MySQL 字段关键字等结果中的记录进行排序 [重复]

mysql数据库中某个字段存的是json数据,如何对json数据中的数据进行操作?