MySQL Как GROUP_CONCAT конкретное поле? - PullRequest
0 голосов
/ 28 мая 2011

У меня есть одна таблица с локализованными строками и одна таблица, создающая теги со значениями путем объединения и ссылки на 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 (не стесняйтесь предлагать любую оптимизацию) для поиска idTag и idValueв таблице Strings и получить их текстовые значения.

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

IFNULL позволяет мне выбрать предпочтительный язык и язык по умолчанию, если ничего не определено (null).В итоге я получаю этот результат.

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 (с разными значениями).То, что я хотел бы сделать, - это сконцентрировать значения для тега Color в один тег, подобный этому:

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 Ответ

1 голос
/ 28 мая 2011

Я не проверял это:

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
...