2012-05-15 51 views
0

已知以下行選擇多列:從基於相同的相關表

fav_colors 
----------------------- 
id col1 col2 col3 
----------------------- 
01 01  03  03 
02 04  02  01 
03 01  03  02 

colors 
----------- 
id colors 
----------- 
01 green 
02 red 
03 blue 
04 orange 

什麼樣的SELECT語句的工程,從colors拉字符串值在特定ID的所有3種顏色fav_colors表?

喜歡的東西:

SELECT col1, col2, col3 
FROM fav_colors 
INNER JOIN ? 
WHERE fc.id = 03; 

我猜一個fav_color陣列將使它更容易些,但我靠着這些值是單獨的列。你如何將同一個表連接到另一個表中的多個列?

編輯:以下所有答案在技術上是可行的。同意如果嚴重依賴多種顏色信息,則最好在fav_colors中將每種顏色記錄爲參考行。謝謝!

回答

2

表的別名...

SELECT fc.id, fc.col1, c1.colors, fc.col2, c2.colors, fc.col3, c3.colors 
    FROM fav_colors AS fc 
    JOIN colors AS c1 ON fc.col1 = c1.id 
    JOIN colors AS c2 ON fc.col2 = c2.id 
    JOIN colors AS c3 ON fc.col3 = c3.id 
WHERE fc.id = 03; 

理想情況下,你有一個fav_colors表更像是:

CREATE TABLE fav_colors 
(
    id INTEGER NOT NULL REFERENCES Users, -- Hypothetical table defining id values 
    seq INTEGER NOT NULL CHECK(seq BETWEEN 1 AND 3), 
    color INTEGER NOT NULL REFERENCES Colors 
    PRIMARY KEY(id, seq) 
); 

您可能需要調整一些語法爲您的特定的DBMS。

+0

選上的改變列名顏色只是在陳述這個概念在這裏失蹤:表別名。 – PHPeer

4

三種連接到不同列的伎倆:

SELECT c1.colors AS c1, c2.colors AS c2, c3.colors AS c3 
FROM fav_colors AS fc 
INNER JOIN colors AS c1 on c1.id = fc.col1 
INNER JOIN colors AS c2 on c2.id = fc.col2 
INNER JOIN colors AS c3 on c3.id = fc.col3 
WHERE fc.id = 03; 

請記住,這是相當糟糕表格設計(沒有可擴展性在所有)。

SQLFiddle:http://sqlfiddle.com/#!2/5b01b/6

+0

我知道這是一個很大的話題,但爲什麼它不是可擴展的?上述場景是更大,更徹底的標準化表格的一小部分。這有什麼理由呢? – PHPeer

+0

如果你想在你的清單上添加第四種顏色,該怎麼辦? – hkf

1
SELECT (SELECT color FROM colors WHERE id = col1) AS color1, 
(SELECT color FROM colors WHERE id = col2) AS color2, 
(SELECT color FROM colors WHERE id = col3) AS color3 
FROM fav_colors WHERE id = 03; 

我的顏色表

+0

也許不是最明顯的解決方案,但它的工作原理。 –