2012-07-07 65 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