MySQL获取SET中唯一项的列表

时间:2010-04-11 06:38:48

标签: mysql set

我有一个带有SET类型的列的产品表(称为especialidad),带有这些可能的值。

[0] => NADA
[1] => Freestyle / BMX
[2] => Street / Dirt
[3] => XC / Rural Bike
[4] => All Mountain
[5] => Freeride / Downhill / Dual / 4x
[6] => Ruta / Triathlon / Pista
[7] => Comfort / City / Paseo
[8] => Kids
[9] => Playera / Chopper / Custom
[10] => MTB recreacion
[11] => Spinning / Fitness

任何特定产品都可以有一个或多个这样的i / e“Freestyle / BMX,Street / Dirt” 给定行的子集,我需要获得所有当前“especialidad”值的列表。但我需要一个爆炸和独特的列表

  • 第1条:“Freestyle / BMX,Street / Dirt”
  • 第2条:“街头/污垢,孩子们”
  • 第2条:“孩子们”
  • 第4条:“街头/污垢,全山”
  • 第5条:“街头/污垢”

我需要一个像这样的列表

  • Freestyle / BMX
  • Street / Dirt“
  • 儿童“
  • All Mountain“

我尝试使用group_concat(UNIQUE),但我得到了一个排列列表......

更新: especialidad是SET类型的列。没有联接,只有一个表。

假设该表具有ID列,名称列和特殊列。

especialidad:set('NADA','Freestyle / BMX','Street / Dirt','XC / Rural Bike','All Mountain','Freeride / Downhill / Dual / 4x','Ruta / Triathlon / Pista','Comfort / City / Paseo','Kids','Playera / Chopper / Custom','MTB recreacion','Spinning / Fitness')

2 个答案:

答案 0 :(得分:1)

您可以使用BIT_OR聚合函数查找所有已设置的值:

Select BIT_OR(especialidad) AS active_values
    from myTable WHERE [your selection criteria];

然后,完成后,您可以使用concat_ws编写一个混乱的条件来将该组的位值解码回stings:

Select concat_ws(','
    if (num&1,'NADA',null),
    if (num&2,'Freestyle / BMX',null),
    if (num&4, 'Street / Dirt',null),
      ... etc ...
    ) from 
       (Select BIT_OR(especialidad) AS num from myTable 
         WHERE [selection criteria]) as t;

但我还建议您阅读有关SET数据类型的this article,特别是标题为“为什么不应该使用SET”的部分。

答案 1 :(得分:0)

您应该让我们了解您的数据库结构。但是我们在这里做一些假设。

我假设有一些ProductEspecialidad表具有ProductID和EspecialidadID。

然后Article1有两个记录=> EspecialidadID = 1,EspecialidadID = 2

因此,在显示屏上,您为ProductID选择所有ProductEspecialidad并显示文本说明。

如果您需要一个类似于您所描述的列表(并且Especialidad的名称在列名称中),那么您需要

select name from Especialidad where ID in 
  (select unique EspecialidadID  from ProductEspecialidad
   where ProductID = [your products selection conditions or nothing])