Mysql : problème plusieurs requêtes avec "ou"

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Mysql : problème plusieurs requêtes avec "ou"

par Murphy39 » 10 mai 2005, 11:14

Pour finir j'ai trouver la solution qui est la meilleur je pense::idea:

le sauf se traduit par un NON ET logique et donc il m'a suffit de transformer par exmple un "=" en "!=" ou un ">" en "<=" ...

Merci pour vos réponses, notre problème est résolu enfin à priori ! 8) :?

Sauf ou Ou

par Murphy39 » 10 mai 2005, 09:26

C'est la déjà la solution que j'ai réaliser pour le ou logique avec la gestion des priorités ??
avec des parenthèses.
Par exemple : condition1 = 'x' OR (condition1 = 'y' AND condition2 = 'z').
Donc là, ça sera soit on vérifie juste que la condition1 est égale à x soit que cette même condition soit égale à y ET condition deux est égale à z
Mais le truc c'est que j'ai des questions et que je veux en prendre sans quelques unes ...
Comme en maths avec les ensembles: E\A ( E privé de A)
Alors j'avais pensé a NOT IN( en requete imbriquée mais c'est possible qu'à partir de Mysql 4.0 que je n'ai pas ...
Mais c'est pour la création de dynamique d'une requête qui me pose problème car même si plusieurs solutions sont possibles le langage lui a ses limites :cry:

par Cyrano » 10 mai 2005, 08:55

avec des parenthèses. Par exemple : condition1 = 'x' OR (condition1 = 'y' AND condition2 = 'z'). Donc là, ça sera soit on vérifie juste que la condition1 est égale à x soit que cette même condition soit égale à y ET condition deux est égale à z

par quick25 » 10 mai 2005, 08:33

Bonjour à tous, nous revoilà :roll:

Une nouvelle petite question se pose :

Ripat pour ta proposition comment pourrions nous faire pour que dans une meme requête il soit possible de rechercher avec "et" (and), "ou"(or) et "sauf"?? La question c'est comment matérialiser ce "sauf". Merci bcp d'avance :oops: :wink:

par Murphy » 09 mai 2005, 16:52

Ok ça m'a l'air plus simple à réaliser avec ppur la contruction de la requete en php avec plusieurs variables servant à recuperer des parties de la requete ... => trop compliqué à expliqué ... :D

Bon je m'occupe de ça demain j'ai fini pour aujourd'hui !

par Ripat » 09 mai 2005, 16:28

Tout d'abord de séparer jointure et conditions. Ce sont deux choses différentes. Lis ceci:
UN CONSEIL IMPORTANT

Dans la mesure du possible, utilisez toujours un opérateur de jointure normalisé Sql2 (mot clef JOIN).

En effet :

* Les jointures faites dans la clause WHERE (ancienne syntaxe de 1986 !) ne permettent pas de faire la distinction de prime abord entre ce qui relève du filtrage et ce qui relève de la jointure.
* Il est à priori absurde de vouloir filtrer dans le WHERE (ce qui restreint les données du résultat) et de voiloir "élargir" ce résultat par une jointure dans la même clause WHERE de filtrage.
* La lisibilité des requêtes est plus grande en utilisant la syntaxe à base de JOIN, en isolant ce qui est du filtrage et de la jointure, mais aussi en isolant avec clarté chaque condition de jointures entre chaque couples de table.
* L'optimisation d'exécution de la requête est souvent plus pointue du fait de l'utilisation du JOIN.
* Lorsque l'on utilise l'ancienne syntaxe et que l'on supprime la clause WHERE a des fins de tests, le moteur SQL réalise le produit cartésiens des tables ce qui revient la plupart du temps à mettre à genoux le serveur !
Ensuite tu peux t'occuper, tranquillement, des conditions. Si tu ne veux pas te casser la tête avec la précédences des opérateurs, mets des parenthèses, elle ne ralentissent pas l'exécution de la requête et elle permettent une bien meilleure lisibilité. Les parenthèses ont la plus haute priorité.

Edit: exemple

Code : Tout sélectionner

SELECT DISTINCT q.cleQuestion FROM question q JOIN origine o ON q.cleOrigine = o.cleOrigine JOIN facilite fa ON q.numFacilite = fa.numFacilite WHERE q.cleQuestion='321' OR ( o.cleOrigine = '7' AND fa.numFacilite = '40')

Nouvelle question

par Murphy » 09 mai 2005, 16:08

J'ai compris les priorités donc voilà un bon exemple en mettant les parentheses sans inclure les jointures.
select distinct Q.cleQuestion
from QUESTION Q,ORIGINE O,FACILITE FA
where Q.cleQuestion='321' 
or ( O.cleOrigine='7' and FA.numFacilite='40' ) 
and Q.cleOrigine=O.cleOrigine 
and Q.numFacilite =FA.numFacilite
Et en incluant les jointures dans les prenthèses
select distinct Q.cleQuestion
from QUESTION Q,ORIGINE O,FACILITE FA
where Q.cleQuestion='321' 
or ( O.cleOrigine='7' and FA.numFacilite='40' 
and Q.cleOrigine=O.cleOrigine 
and Q.numFacilite =FA.numFacilite)
Qu'est-ce qui est conseillé ?

par Murphy » 09 mai 2005, 16:03

Dans la sélection telle qu'elle vient d'être faite, on sélectionne la question 100 ou la question 101 ( pas dans le sens absolu du terme :) ) tandis que si on fait la sélection avec un 'et' on aura aucun résultat car une question ne peut avoir deux numéro ...

donc avec le 'ou' on obtient bien la question 100 et la 101 comme résultat

par albat » 09 mai 2005, 15:54

Bein tout simplement à afficher deux questions dont la clé serait 100 ou 101 .
Tu en es bien sûr ?... :-k

Alors, vérifie ta requête car telle que tu l'as écrite,
tout ce qu'elle va te retourner, c'est 100 et/ou 101.
Passionnant, non ? :lol:

par quick25 » 09 mai 2005, 15:21

Attention à la précédence des opérateurs logiques!

Si tu écris

Code : Tout sélectionner

SELECT DISTINCT Q.cleQuestion FROM question Q, sens S WHERE Q.cleQuestion='100' OR S.cleSens='10' AND Q.cleQuestion='101'
Revient à dire:

Code : Tout sélectionner

SELECT DISTINCT Q.cleQuestion FROM question Q, sens S WHERE Q.cleQuestion='100' OR (S.cleSens='10' AND Q.cleQuestion='101')
mon collègue (Murphy) et moi somme entrain de tester cette solution, mais c est vrai que les règles de priorité nous ont un peu échappé :lol: :oops: !
En espérant que ca va mieux aller, mais déja merci bcp d'avance pour les réponses déja postées.

par Murphy » 09 mai 2005, 15:19

ok j'ai compris lol

par Murphy » 09 mai 2005, 15:07

Merci c'est un détail que je n'avais pas pris en compte :o

Voilà une requete mieux apropriée :
select distinct Q.cleQuestion from QUESTION Q,SENS S,ORIGINE O,FACILITE FA where S.cleSens='1' or Q.cleQuestion='1011' and O.cleOrigine='4' and FA.numFacilite='60' and Q.cleSens=S.cleSens and Q.cleOrigine=O.cleOrigine and Q.numFacilite =FA.numFacilite


En faite ma réelle question est :
Est-ce que le OU imbrique tout le reste de la sélection ( ce qu'il y a après ):
Q.cleQuestion='1011' and O.cleOrigine='4' and FA.numFacilite='60'

par Ripat » 09 mai 2005, 14:41

Attention à la précédence des opérateurs logiques!

Si tu écris

Code : Tout sélectionner

SELECT DISTINCT Q.cleQuestion FROM question Q, sens S WHERE Q.cleQuestion='100' OR S.cleSens='10' AND Q.cleQuestion='101'
Revient à dire:

Code : Tout sélectionner

SELECT DISTINCT Q.cleQuestion FROM question Q, sens S WHERE Q.cleQuestion='100' OR (S.cleSens='10' AND Q.cleQuestion='101')
Cela correspond t'il à ce que tu veux faire?

Lecture: http://dev.mysql.com/doc/mysql/fr/opera ... dence.html


Edit Hum, je me suis un peu emmêllé les pinceaux sur ce coup là...

oups

par Murphy » 09 mai 2005, 14:22

=> avec une cleQuestion égal à 101

par Murphy » 09 mai 2005, 14:20

Bein tout simplement à afficher deux questions dont la clé serait 100 ou 101 .
Mais là il ya un autre problème d'après cette solution...

Comment gérer les priorités si l'on veut faire par exemple:
select distinct Q.cleQuestion
from QUESTION Q,SENS S
where Q.cleQuestion='100'
or S.cleSens='10'
and Q.cleQuestion='100'

Bizzarement ça fait planter Mysql selon les requêtes que l'ont fait avec le ou logique ... :(