2010-07-13 9 views
2

Comment puis-je exécuter mysql et ou interroger ensemble instant de requête séparée. .: par exemplemysql et ou interroger ensemble

Et requête:

select * form tablename where name='A' and password="A" and id='A'; 

Ou requête:

select * form tablename where name='A' or password="A" or id='A'; 

-Ce sont deux différentes requêtes, puis-je faire ces requêtes ensemble quelle est la syntaxe ??

+0

Les requêtes sont identiques. * confus * – thomasfedb

Répondre

3

Eh bien, vous pouvez simplement l'union entre eux mais, puisque l'un est un sous-ensemble de l'autre, ce n'est pas strictement nécessaire:

select * from tablename 
    where name = 'A' and password = 'A' and id = 'A' 
union select * from tablename 
    where name = 'A' or password = 'A' or id = 'A' 

Cela vous donnera exactement les mêmes résultats que si vous venez courir la deuxième requête sur son propre. Cela aura du sens une fois que vous vous rendrez compte que chaque ligne de la première requête a un name égal à 'A', donc il va correspondre à la première partie de la clause where dans la deuxième requête.

Si vous souhaitez dupliquer des lignes pour celles retournées dans les deux requêtes, utilisez simplement union all au lieu de union.

Si vous utilisiez 'A' comme espace réservé et que ses valeurs sont différentes dans les deux requêtes, vous avez deux approches. Utilisez une construction comme:

... where (name = 'A' and password = 'B' and id = 'C') 
     or name = 'D' or password = 'E' or id = 'F' 

ou utiliser la solution union j'ai donné ci-dessus, quelque chose comme:

select * from tablename 
    where name = 'A' and password = 'B' and id = 'C' 
union select * from tablename 
    where name = 'D' or password = 'E' or id = 'F' 

(utilisation union all lorsque vous savez il n'y a pas possibilité de doublons entre les deux requêtes, - il sauvera le SGBD de la difficulté de supprimer les doublons inexistants - ce n'est pas le cas avec ces requêtes).

Le unionpeut donner de meilleures performances sur un SGBD qui peut ruche au large des deux sélections plus facilement aux moteurs de requêtes distincts (ce qui serait plus difficile avec une seule requête avec un complexe où l'article). Bien sûr, comme toutes les optimisations, mesurer, ne pas deviner.

9

Utilisez des parenthèses pour regrouper les conditions?

SELECT * FROM table WHERE (X and Y or Z) AND (P and Q or F)

0

Utilisez () pour ce type de conditions

select * form tablename 
     where name='A' OR password="A" OR id='A' OR 
        (name='A' AND password="A" AND id='A') 

Si vous voulez vérifier la même chaîne que A ici vous obtiendrez même o/p en utilisant requête suivante

select * form tablename 
     where name='A' OR password="A" OR id='A' 
+0

La partie finale "OR (...)" est d'ailleurs superflue. – paxdiablo

+0

@paxdiablo: - je mets à jour ma réponse mais comme il veut savoir comment utiliser 'AND' et' OR' dans une seule requête je ne supprime aucune de ces réponses. – Salil

+0

Non, c'est probablement une bonne chose. À l'origine, il ne m'était pas venu à l'esprit que «A» pouvait simplement être un espace réservé différent dans les deux conditions, et non une valeur littérale garantie être la même. – paxdiablo

0

Il suffit de combiner les conditions avec WHERE

SELECT * FROM tablename WHERE (name='A' AND password='A' AND id='A') OR name='A' OR password='A' OR id='A' 

Les parenthèses veiller à ce que les AND entières expressions « valide » que si toutes les conditions contenant sont vraies tandis que le reste macthes la OR

1

On ne sait pas ce que vous attendez que le résultat, mais je pense que vous veulent une UNION:

SELECT 1 `query`, `name`, `password`, `id` 
FROM `tablename` WHERE `name`='A' and `password`='A' and `id`='A' 
UNION 
SELECT 2 `query`, `name`, `password`, `id` 
FROM `tablename` WHERE `name`='A' or `password`='A' or `id`='A' 

Notez que la première colonne query en résultat est nécessaire pour séparer les résultats des deux requêtes parce que l'union de (X et Y) et (X ou Y) est toujours (X ou Y).

Questions connexes