-1
votes

Sélection compliquée dans MySQL (Table EAV)

J'ai donc une table comme celle-ci:

|---group---|---property---|---value---|
|     a     |   prop1      |    yes    |
|     a     |   prop2      |    yes    |
|     a     |   prop3      |    no     |
|     b     |   prop1      |    yes    |
|     b     |   prop2      |    no     |
|     b     |   prop3      |    no     |
|     c     |   prop1      |    no     |
|     c     |   prop2      |    no     |
|     c     |   prop3      |    no     |


3 commentaires

Spécifiez également le résultat attendu.


Sélectionnez `Group` à partir de` Tablename` où `Property` = 'Prop1' et` Value` = 'Oui' ?


où la propriété = 'prop1' et valeur = 'oui' ? Sinon faire comme @jarlh a dit.


4 Réponses :


3
votes

Vous pouvez utiliser une sous-requête pour choisir la liste des groupes de valeur code> = 'prop1' et valeur code> = "oui". Ensuite, sélectionnez Tous les enregistrements de la liste des groupes comme ci-dessous-

....
WHERE 
(
    `Property` = 'prop1'
    AND `Value` = 'Yes'
)
AND -- You can also use OR here if you need rows if any of the condition is true
(
    `Property` = 'prop3'
    AND `Value` = 'No'
)


3 commentaires

Cela fonctionne, mais si je veux combiner plusieurs propriétés différentes? Par exemple, si je veux prop1 pour être oui et prop3 pour être non ?


Vous pouvez ajouter plus de conditions en sous-requête selon la condition requise.


Ajout de code d'échantillon pour combiner plusieurs propriétés différentes.



1
votes

Une seule propriété est simple xxx


2 commentaires

Et qu'en est-il de multiples propriétés?


Voir Stackoverflow.com/Questions/649802/...



1
votes

Vous pouvez utiliser Exist:

select t.* from tablename t
where exists (
  select 1 from tablename
  where `group` = t.`group`
  and (
    (property = 'prop1' and `value` = 'yes')
    or
    (property = 'prop2' and `value` = 'no') 
  )
)


0 commentaires

0
votes

Juste FYI, vous pouvez également écrire ceci (bien que cela puisse avoir une capacité plus limitée à utiliser des index ...

SELECT * FROM my_table WHERE(x,y) IN((1,'yes'),(2,'no'),(3,'maybe'));


0 commentaires