mysql加入csv字段?

标签 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

如何获取文本中的颜色选项(黑色、红色、蓝色、绿色)而不是纯数字?

我尝试使用 join,但它不适用于 csv 字段。

提前致谢

最佳答案

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?

关于mysql加入csv字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21009872/

相关文章:

MySQL root 密码更改

mysql - Laravel 迁移 - 未创建表

sql - 选择查询以获取与列中所有值对应的行

mysql - mysql 数据库错误过程

mysql - 如何在Mysql上连接多个表并结果4列记录

sql - 连接三个表不返回数据

mysql - 为什么我的删除触发器没有删除任何行?

mysql - 错误 : Call to a member function setStats() on a non-object

sql - 如果作者写了不止一篇文章,为什么这个SQL查询将文章的作者名返回NULL?

join - 连接 Kafka ksqlDB 上的两个表时出现错误 "Invalid join condition: table-table joins require to join on the primary key of the right input table"