2012-07-07 40 views
0

我有一個包含SET數據類型的列的MySQL 5.5表。每個條目對於SET列具有0到4個值。我想寫一個SELECT語句,它將爲SET中的每個值返回一個單獨的行。這是可能的一個單一的聲明?從單個結果返回SET作爲多行

由於提前, 彼得

EDIT

被修改成包括例如:

表結構是非常基本的:

  • INT(6)UNSIGNED PRIMARY KEY(id)
  • VARCHAR(20)UNIQUE IN DEX(材料)
  • SET(「固」,「液體」,「氣體」,「血漿」)(狀態)

在上面的例子可以想像具有填充了各種材料的表(材料)和每個SET列包含所有材料可以存在的狀態(狀態)。我希望看到該語句爲材料所具有的每個SET值返回一個單獨的行,並複製該ID和材料名稱。

希望能幫助澄清事情。

+0

請問'SELECT ... WHERE set_col& 1 UNION ALL SELECT ... WHERE set_col&2'等等爲你做詭計嗎? – raina77ow 2012-07-07 23:13:45

+0

SET中有20多個選項,這使得這個解決方案實現起來有點乏味。如果沒有更好的方法去做,我會回到這種方法。 – 2012-07-07 23:23:07

+1

@PeterHanneman,你可以發佈你的表模式以及一些示例數據,以便我們更清楚我們在這裏工作的內容嗎? – 2012-07-07 23:33:58

回答

3

如果有20個可能的狀態,但材料只能有高達4:

嘗試這種解決方案:

SELECT 
    a.material, 
    a.states 
FROM 
(
    SELECT material, SUBSTRING_INDEX(states,',',1) AS states 
    FROM settbl 

    UNION 

    SELECT material, SUBSTRING_INDEX(SUBSTRING_INDEX(states,',',-3),',',1) AS states 
    FROM settbl 

    UNION 

    SELECT material, SUBSTRING_INDEX(SUBSTRING_INDEX(states,',',-2),',',1) AS states 
    FROM settbl 

    UNION 

    SELECT material, SUBSTRING_INDEX(states,',',-1) AS states 
    FROM settbl 
) a 
ORDER BY 
    a.material 

SQL-Fiddle Demo

+0

這很奇妙!非常感謝你! – 2012-07-08 00:59:48

+0

其實,我所做的只是稍微有點錯(沒有選擇列表中的第二項),請使用我剛剛編輯的解決方案。 – 2012-07-08 01:00:04