2010-04-11 4 views
1

J'ai une table de produits avec une colonne de type SET (appelé especialidad), avec ces valeurs possibles.MySQL obtenir la liste des éléments uniques dans un 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 

Tout produit donné peut avoir un ou plusieurs de ces i/e « Freestyle/BMX, Street/Dirt » Étant donné un sous-ensemble des lignes, je dois obtenir une liste de tous les présents « especialidad » valeurs. Mais je besoin d'une liste pour exploser et unique

  • Article1: "Freestyle/BMX, Street/Dirt"
  • Article2: "Street/Dirt, Kids"
  • article 2: "Kids"
  • article4: "Street/Dirt, All Mountain"
  • article 5: "Street/Dirt"

je besoin d'une telle liste

  • Freestyle/BMX
  • Street/Dirt "
  • Kids"
  • All Mountain »

J'ai essayé avec group_concat (UNIQUE) mais je reçois une liste des permutations ...

Mise à jour: especialidad est une colonne de type SET. Il n'y a pas de joint à faire, seulement une table.

Il suffit de prendre la table a une colonne d'identité, une colonne de nom d'une colonne de especialidad.

especialidad: ensemble ('NADA', 'Freestyle/BMX', 'Street/Dirt', 'XC/Rural Bike', 'All Mountain', 'Freeride/Descente/Dual/4x', 'Ruta/Triathlon/Pista ',' Confort/Ville/Paseo ',' Enfants ',' Playera/Chopper/Custom ',' VTT recreacion ',' Spinning/Fitness ')

Répondre

1

Vous pouvez utiliser la fonction d'agrégation BIT_OR pour trouver tous les les valeurs qui sont définies:

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

Et puis, après avoir fait cela, vous pouvez écrire un désordre conditionnel à l'aide CONCAT_WS pour décoder les valeurs de bits du retrait aux piqûres:

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; 

Mais je vous suggère également de lire this article sur le type de données SET, en particulier la section intitulée «pourquoi vous ne devez pas utiliser SET».

+0

BIT_OR a fait le travail. Pas besoin du conditionnel en désordre, j'ai déjà une fonction en php pour décoder/encoder. --- J'ai lu cet article il y a longtemps, et aucun des inconvénients ne s'applique à ce cas d'utilisation particulier, plus l'opérateur au niveau du bit est TRÈS utile. Mais ne savais pas à propos de BIT_OR ... –

0

Vous devriez nous en dire plus sur la structure de votre base de données. Mais faisons quelques suppositions ici.

Je suppose qu'il ya une table de ProductEspecialidad qui a ProductID et EspecialidadID.

Alors Article1 a deux enregistrements il => EspecialidadID = 1 et EspecialidadID = 2

donc sur l'écran vous sélectionnez tous ProductEspecialidad pour une ProductID et d'afficher les descriptions textuelles.

Si vous avez besoin d'une liste comme vous avez décrit (et le nom de Especialidad est dans la colonne nom), alors vous devez

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

especialidad est une colonne de type SET. Il n'y a pas de joint à faire, seulement une table. Supposons simplement que la table a une colonne ID, une colonne de nom et une colonne especialidad. especialidad: ensemble ('NADA', 'Freestyle/BMX', 'Street/Dirt', 'XC/Rural Bike', 'All Mountain', 'Freeride/Descente/Dual/4x', 'Ruta/Triathlon/Pista ',' Confort/Ville/Paseo ',' Enfants ',' Playera/Chopper/Custom ',' VTT recreacion ',' Spinning/Fitness ') –

Questions connexes