2010-04-11 100 views
1

我有一個SET類型的列(稱爲especialidad)的產品表,帶有這些可能的值。MySQL獲取SET中唯一項目的列表

 
[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「自由式/ BMX,街/越野」 鑑於中行的子集,我需要得到一個列表中的所有本「especialidad」值。但是,我需要被分解了的列表和獨特

  • 第一條: 「自由式/ BMX,街/越野」
  • 第二條: 「街/污垢,孩子」
  • 第二條: 「孩子們」
  • 第四條: 「街頭/越野,全山地」
  • 第五條: 「街頭/越野」

我需要這樣的

列表
  • 自由式/ BMX
  • 街/越野 「
  • 孩子」
  • 全山地」

我試圖與GROUP_CONCAT(唯一的),但我得到的排列的列表...

更新: especialidad是SET類型的列。沒有加入,只有一個表。

假設表中有一個ID列,名稱列是一個especialidad列。 ('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')

回答

1

您可以使用BIT_OR聚合函數查找所有所設置的值:

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

然後,已經做到這一點,您可以使用CONCAT_WS的設置回刺的位值解碼寫一個混亂的條件:

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」的部分。

+0

BIT_OR完成了這項工作。不需要雜亂的條件,我已經有一個功能在PHP解碼/編碼。 --- 我很久以前就讀過這篇文章,並且這些缺點都不適用於這種特殊用例,加上按位運算符非常有用。但不知道BIT_OR ... – 2010-04-11 08:29:04

0

您應該讓我們更多地瞭解您的數據庫結構。但是,我們在這裏做一些假設。

我假設有一些ProductEspecialidad表有ProductID和EspecialidadID。

然後第一條具有兩個記錄存在=> EspecialidadID = 1和EspecialidadID = 2

所以在畫面中,您選擇所有ProductEspecialidad的產品ID,並顯示文字說明。

如果你喜歡你所描述會需要一個列表(和Especialidad的名字在列),那麼你需要

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

especialidad是SET類型的列。沒有加入,只有一個表。 假設表中有一個ID列,名稱列是一個especialidad列。 ('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') – 2010-04-11 07:23:41