mysql加入csv字段?

时间:2014-01-09 01:09:11

标签: mysql sql join

我有三张表,如下面

http://sqlfiddle.com/#!2/82212/6

CREATE TABLE IF NOT EXISTS `cat` (
  `id` int(15) NOT NULL AUTO_INCREMENT,
  `color_options` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
);
INSERT INTO `cat` (`id`, `color_options`) VALUES (1, '1,2,3,4');


CREATE TABLE IF NOT EXISTS `template` (
  `id` int(15) NOT NULL AUTO_INCREMENT,
  `cat_id` int(15) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
);

INSERT INTO `template` (`id`, `cat_id`) VALUES (1, 1);


CREATE TABLE IF NOT EXISTS `color` (
  `id` int(15) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `code` varchar(6) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
);

INSERT INTO `color` (`id`, `name`, `code`) VALUES
(1, 'Black', '000000'),
(2, 'Red', 'FF0000'),
(3, 'Blue', '0000FF'),
(4, 'Green', '00FF00');

如果我跑

SELECT * 
FROM template
LEFT JOIN cat ON cat.id=template.id;

然后我会得到

id  cat_id  color_options

1   1   1,2,3,4

如何获取文字(黑色,红色,蓝色,绿色)中的颜色选项而不是普通数字?

我尝试使用连接但它在csv字段上不起作用。

提前致谢

2 个答案:

答案 0 :(得分:2)

MySQL有一个函数FIND_IN_SET(),它使用一串逗号分隔的值。它返回匹配元素的位置,如果未找到匹配则返回0。有关详细信息,请参阅documentation

例如:

SELECT * 
FROM template
JOIN cat ON cat.id=template.id
JOIN color ON FIND_IN_SET(color.id, cat.color_options)

请注意,使用以逗号分隔的列表会破坏使用索引提高查询效率的任何机会。它还有许多其他缺点。见Is storing a delimited list in a database column really that bad?

答案 1 :(得分:1)

使用GROUP_CONCAT()

的子查询
SELECT *,(SELECT GROUP_CONCAT(name) FROM color WHERE CONCAT(',',cat.color_options,',') LIKE CONCAT('%,',color.id,',%')) color_options_text
FROM template
LEFT JOIN cat ON cat.id=template.id

其他人使用了我新功能,这也适用于&阅读更清晰

SELECT *,(SELECT GROUP_CONCAT(name) FROM color WHERE FIND_IN_SET(color.id,cat.color_options)) color_options_text
FROM template
LEFT JOIN cat ON cat.id=template.id