MySQL如何GROUP_CONCAT特定字段?

时间:2011-05-28 17:06:43

标签: mysql sql aggregate-functions group-concat

我有一个包含本地化字符串的表,另一个表通过组合和引用表idString中的Strings来创建包含值的标记。在底部,您可以找到一个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 statemenet(随意建议任何优化)来查找表Strings中的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 CONCAT分成如下标签:

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 个答案:

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