2014-01-09 56 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()A子查詢

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