2010-09-22 14 views
4

J'ai une seule table DB (MySQL) sur laquelle je lance un SELECT simple. Dans ce tableau, j'ai 3 champs qui contiennent chacun 3 valeurs possibles. Dans chaque cas, les valeurs sont identiques («aucun», «en ligne», «physique»). Je veux retourner dans mon résultat une valeur true ou false pour un alias si l'un de ces champs n'est pas défini sur 'none'.Comment retourner vrai ou faux si plusieurs colonnes égalent une certaine valeur dans la requête MySQL?

Je peux facilement l'évaluer en PHP après avoir renvoyé mon jeu de résultats, mais afin de trier facilement mes résultats, je préfère générer le vrai/faux dans le SELECT si possible. Donc, à l'heure actuelle une ligne de résultat pourrait ressembler à ceci:

id: 1 
trial_type_1: none 
trial_type_2: online 
trial_type_3: none 

Dans ce cas, je veux la requête pour revenir:

id: 1 
trial: True 

Si tous les champs de trial_type ont été fixés sans pareil, il retournerait alors un procès valeur de False. Toutes les idées grandement appréciées puisque je n'ai vraiment aucune idée par où commencer ou même quoi chercher en ligne! :)

Répondre

6

J'utiliserais une déclaration de cas à l'intérieur de ceci, c'est une méthode très flexible et peut être très utile.

select id, 
(CASE WHEN trial_type_1 <> 'none' OR trial_type_2 <> 'none' 
      OR trial_type_3 <> 'none' 
THEN 'True' ELSE 'False' END) as trial 
FROM q3773072 

Cependant, vous pouvez tout aussi bien le faire comme une simple opération logique - qui peut-être plus proche de ce que vous voulez, comme suit:

SELECT id, 
     (trial_type_1 <> 'none' OR trial_type_2 <> 'none' OR trial_type_3 <> 'none') as Trial 
from q3773072 

La correcte façon de le faire est Bien sûr, pour stocker les différents trial_types dans une table différente - lorsque vous commencez à numéroter des champs, c'est un indice que le schéma de base de données doit changer. Vous devez également configurer une autre table qui définit les types d'évaluation et leur définition, c'est-à-dire s'il s'agit ou non d'un véritable test.

je serais probablement adopter cette dernière approche car il est très probable que vous ajouterez un autre type d'essai à un moment donné dans l'avenir et ce sera douloureux si vous ne le faites pas droit ..

+1

Amen! "quand vous commencez à numéroter des champs c'est un indice que le schéma de base de données doit changer" –

+0

Brill, merci Richard ... dans ce cas le client a un certain nombre de produits dont j'ai besoin pour indiquer un accès d'essai pour seulement 5 au total pour le moment mais oui je pense qu'une certaine abstraction est requise ici! :) –

2

Cela devrait fonctionner:

SELECT 
    id, 
    NOT (trial_type_1 IS NULL AND trial_type_2 IS NULL AND trial_type_3 IS NULL) AS trial 
FROM ... 
+0

En supposant la valeur d'essai "none" est entrée dans la base de données en tant que "NULL". – Alec

0

Cela pourrait fonctionner:

SELECT id, 
     (trial_type_1 <> 'none' 
     OR trial_type_2 <> 'none' 
     OR trial_type_3 <> 'none') AS some_not_none 
FROM ... 
0

Vous pouvez utiliser MySQL IF statement:

SELECT 
    id, 
    IF (
    (trial_type_1 != 'none' 
    OR trial_type_2 != 'none' 
    OR trial_type_3 != 'none' 
    ), 1, 0 
) AS trial 
FROM ...
1

Vous pouvez utiliser CASE:

SELECT ID, CASE WHEN trial_type_1='none' AND trial_type_2='none' AND trial_type_3='none' THEN 'false' ELSE 'true' END 
    FROM YourTable