Page 1 sur 1
Requete SQL avec AND
Posté : 02 août 2008, 14:15
par flotix
Bonjour,
Voilà je fait générer une requête SQL, celle-ci contient beaucoup d'argument mais elle n'affiche rien alors qu'elle contient effectivement des enregistrement bon à afficher.
J'ai tester la requête directement via PHPmyAdmin, même résultat.
Soit ma requête n'est pas correct ou alors la fonction AND est limitée....
Code : Tout sélectionner
SELECT *
FROM `fiche`
WHERE `modele`='170'
AND `modele`='171'
AND `modele`='172'
AND `modele`='173'
AND `modele`='174'
AND `modele`='261'
AND `modele`='177'
AND `modele`='178'
AND `modele`='179'
AND `modele`='180'
AND `modele`='181'
AND `modele`='182'
AND `modele`='183'
AND `modele`='184'
AND `modele`='185'
AND `modele`='186'
AND `modele`='187'
AND `modele`='188'
AND `modele`='189'
AND `modele`='190'
AND `modele`='191'
AND `modele`='192'
AND `modele`='193'
AND `modele`='194'
AND `modele`='260'
AND `modele`='262'
AND `modele`='263'
AND `modele`='264'
AND `modele`='265'
AND `modele`='266'
AND `modele`='267'
AND `modele`='268'
AND `modele`='269'
AND `modele`='270'
AND `modele`='0'
AND `status`='1'
Merci d'avance pour votre aide
Posté : 02 août 2008, 14:22
par ouckileou
Comment la colonne "modele" pourrait elle avoir plusieurs valeurs en même temps ?
Posté : 02 août 2008, 15:28
par Tracker
+1
utilise l'opérateur IN, ça raccourcira l'écriture en "simulant" le OR que tu aurais dû mettre dès le départ:
SELECT * FROM `fiche` WHERE `modele` in ('170', '171', '172', etc... )
[ps] si ta colonne modèle est de type numérique, enlève les quotes autour de tes valeurs.
Tracker.
Posté : 02 août 2008, 15:39
par albat
Modération :
Afin d'obtenir plus de réponses, le sujet est déplacé dans le forum "SQL & Bases de données".
Merci de prendre le temps de lire les règlements
ainsi que l'intitulé de chaque forum avant de poster un nouveau sujet.
Posté : 02 août 2008, 15:44
par Sékiltoyai
[ps] si ta colonne modèle est de type numérique, enlève les quotes autour de tes valeurs.
Dans le cas contraire, il est fort probable que ta table soit mal modélisée…
Posté : 02 août 2008, 16:08
par albat
- Jamais de SELECT *, on précise les champs à retourner
- Pas d'apostrophes sur des données numériques
- Si les valeurs testées se suivent, utiliser les intervalles (opérateur BETWEEN plus optimisé que le IN)
d'où...
Code : Tout sélectionner
SELECT champ_1, champ_2, champ_3
FROM fiche
WHERE status = 1
AND modele = 0
OR modele BETWEEN 170 AND 174
OR modele BETWEEN 177 AND 194
OR modele BETWEEN 260 AND 270
Tout de même plus clair, non ?

Posté : 02 août 2008, 19:30
par flotix
- Jamais de SELECT *, on précise les champs à retourner
- Pas d'apostrophes sur des données numériques
- Si les valeurs testées se suivent, utiliser les intervalles (opérateur BETWEEN plus optimisé que le IN)
d'où...
Code : Tout sélectionner
SELECT champ_1, champ_2, champ_3
FROM fiche
WHERE status = 1
AND modele = 0
OR modele BETWEEN 170 AND 174
OR modele BETWEEN 177 AND 194
OR modele BETWEEN 260 AND 270
Tout de même plus clair, non ?

Hum en ce qui concerne le * je sait que c'est pas top au niveau ressources mais si on à vraiement TOUS à récupérer?
Et quels sont les iconvenients Hormis le cpu?
Sinon mon prob est résolu! Merci à Tracker!
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Posté : 02 août 2008, 20:50
par Tracker
Si tu as tout à récupérer, laisse * ça clarifie le code et ça ne change rien du tout.
Après c'est le type de sujet à faire des débats interminables...
Sékiltoyai +1: Vérifie quand même tes types.
Tracker.
Posté : 03 août 2008, 20:50
par caroube
et puis pour finaliser le tout, quand tu as des OR et des AND, mets des parenthèses. Au moins, ça évite d'avoir à se poser des questions pour savoir si le status, c'est quand le modele vaut 0 uniquement ou si c'est quelque soit la valeur du modele.
Je sais que il y a des as qui connaissent par coeur les règles de préséance des opérateurs, mais il faut penser à nous, ceux qui aimons bien l'explicite.
Code : Tout sélectionner
SELECT champ_1, champ_2, champ_3
FROM fiche
WHERE status = 1
AND (modele = 0
OR modele BETWEEN 170 AND 174
OR modele BETWEEN 177 AND 194
OR modele BETWEEN 260 AND 270)
Posté : 03 août 2008, 22:52
par Victor BRITO
Je sais que il y a des as qui connaissent par coeur les règles de préséance des opérateurs, mais il faut penser à nous, ceux qui aimons bien l'explicite.
En absence de parenthèses, les opérateurs AND et && sont prioritaires par rapport aux opérateurs OR, || et XOR. Donc, dans le contexte de la requête en question, et compte tenu de ce qu'on requiert, les parenthèses sont utiles pour englober les "modele OR modele OR modele".
Pour les règles de précédence des opérateurs, le
manuel de MySQL y consacre une section : il suffit de chercher.
