2009-09-30 9 views
0

J'ai trois colonnes avec trois valeurs qui peuvent être définies pour chaque colonneMySQL Query aide

Column_1 | column_2 | column_3 
________ | ________ | ________ 
COMPLETED| FAILED | PENDING 
COMPLETED| COMPLETED| COMPLETED 
FAILED | COMPLETED| COMPLETED 
COMPLETED| PENDING | COMPLETED 
COMPLETED| COMPLETED| PENDING 
COMPLETED| COMPLETED| COMPLETED 
COMPLETED| COMPLETED| COMPLETED 
PENDING | COMPLETED| COMPLETED 

Vous cherchez des deux requêtes, un à trouver un record avec un statut ATTENDANT et l'autre pour trouver des dossiers avec un ECHEC

REMARQUE: PENDING et devrait avoir la ECHEC même logique

Query: PENDING 
SELECT * FROM tbl 
WHERE Column_1 = 'PENDING' OR Column_2 = 'PENDING' OR Column_3 = 'PENDING' 

Query: FAILED 
SELECT * FROM tbl 
WHERE Column_1 = 'FAILED' OR Column_2 = 'FAILED' OR Column_3 = 'FAILED' 

Ces requêtes ne sont pas les enregistrements corrects tirent. Je pense que cela correspond à la première condition de la clause WHERE, puis à la clause OR en tant que condition distincte. J'ai essayé quelques variations mais toujours pas de chance.

Alt Query: 
SELECT * FROM tbl 
WHERE Column_1 OR Column_2 OR Column_3 = 'PENDING' 

Donc, pour l'état en attente, la requête doit retourner 4 rangées de la grille de données ci-dessus et pour l'état d'échec, la requête doit retourner 2 rangées de la grille de données ci-dessus

+0

Votre première série de questions ont l'air bien - quel est le problème? – Greg

+0

qu'est-ce que vous obtenez? ces deux premières requêtes me vont bien au premier coup d'œil ... Je n'ai jamais essayé ce style de requête alt avant ... mais ça me semble drôle :) – danb

+0

Il est forcé que la condition WHERE soit une contrainte distincte donc les conditions OR sont considérées comme une contrainte séparée. Est-ce que ça a du sens? –

Répondre

2

parenthèse d'emballage Try autour chaque condition pour voir si cela fonctionne:

SELECT * FROM tbl 
WHERE (Column_1 = 'PENDING') OR (Column_2 = 'PENDING') OR (Column_3 = 'PENDING') 

Je suis vraiment pas familier avec MySQL, mais cela pourrait être une meilleure façon, quelqu'un peut me corriger si je me trompe:

SELECT * FROM tbl OU 'pending' IN (Colonne_1, Column_2, Column_3, Column_4)

Encore une fois, si ce qui précède est incorrect, je suis désolé.

+0

Merci qui a fait l'affaire –

+1

Phill, cette option IN fonctionne aussi bien. Juste curieux – Xaisoft

+0

J'aime la mise à jour, semble plus propre que d'avoir toutes les conditions OU. Merci encore –

1

Votre première requête semble correcte. Il est possible que vous utilisiez le type de données char, ce qui prête à confusion, c'est-à-dire que vous devrez peut-être ajouter des espaces de fin. Pouvez-vous poster votre schéma?

+0

Un moyen rapide de vérifier ceci serait de changer les requêtes à utiliser LIKE; c'est-à-dire "WHERE column_1 LIKE" PENDING% "OU column_2 =" PENDING% "...". Si cela fonctionne, il est clair que vous avez des problèmes d'espace. – AgentConundrum

+0

Utilisation des types de données VARHCAR –

+0

Aucun problèmes d'espace que les données sont saisies par le script et est rognée avant l'insertion –

0

Si le comportement est bizarre, j'essaierais une parenthèse.

Query: PENDING 
SELECT * FROM tbl 
WHERE ((Column_1 = 'PENDING') OR (Column_2 = 'PENDING') OR (Column_3 = 'PENDING')) 

Query: FAILED 
SELECT * FROM tbl 
WHERE ((Column_1 = 'FAILED') OR (Column_2 = 'FAILED') OR (Column_3 = 'FAILED')) 

Bien, je vais être honnête, je ne sais pas pourquoi cela fonctionnerait mieux/pire: car tout ce que vous utilisez est « OR » il ne devrait pas d'importance.

0
SELECT * FROM tbl 
WHERE Column_1 OR Column_2 OR Column_3 = 'PENDING' 

C'est certainement pas va revenir ce que vous pensez. Voici comment il est évalué:

SELECT * FROM tbl 
WHERE (Column_1) OR (Column_2) OR (Column_3 = 'PENDING') 

En utilisant une colonne de chaîne comme terme de vérité évalue la chaîne comme un entier, qui, dans ces exemples est 0, interprété comme false. Donc, c'est comme:

WHERE (false) OR (false) OR (Column_3 = 'PENDING') 

L'effet est qu'il ne tient pas compte des deux premières colonnes et renvoie des lignes uniquement lorsque la troisième colonne correspond 'PENDING'. En d'autres termes, vous avez donné une requête qui est syntaxiquement valide mais qui n'a pas le résultat que vous souhaitez obtenir.

Les deux premières requêtes que vous avez effectuées renvoient 4 lignes où une colonne est 'PENDING' et deux lignes où une colonne est 'FAILED'. Je viens de tester cela et ça fonctionne.Si cela ne correspond pas à vos attentes, vous pouvez peut-être clarifier:

  • Quelle requête avez-vous essayé?
  • Qu'est-ce qui a été retourné?
  • Quel résultat attendiez-vous à la place?
+0

Bill, Curieuse, ne t-sql ou pl-sql font la même chose? – Xaisoft

+0

Pourquoi, dans ce cas aussi sont les chaînes transformées en 0 et non 1. – Xaisoft

+0

En MySQL, jetant une chaîne à un nombre entier Emprunte les principaux chiffres numériques dans la chaîne, par défaut à 0 s'il n'y en a pas. Donc, ' « 123abc'' jette à l'entier 123, mais ' » abc123'' jette à l'entier 0. –