2014-01-09 3 views
0

У меня есть три таблицы, как показано нижеmysql присоединяется к полям csv?

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.

Заранее спасибо

+0

Нормализация базы данных, и вы выиграли» У меня такие проблемы. Если вы не знаете, что это значит, я хорошо слышал о книге «Дизайн баз данных для простых смертных». –

ответ

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 
+0

спасибо за два решения – Chung

1

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?

+0

Это вернет 1 строку для каждого цвета, я думаю, что OP хочет все имена цветов в одном столбце – EkriirkE

Смежные вопросы