Requete SQL avec AND

Eléphant du PHP | 65 Messages

02 août 2008, 14:15

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
La puissance n'est rien sans maitrise.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 août 2008, 14:22

Comment la colonne "modele" pourrait elle avoir plusieurs valeurs en même temps ?

Eléphant du PHP | 443 Messages

02 août 2008, 15:28

+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.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 août 2008, 15:39

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.

ViPHP
ViPHP | 5924 Messages

02 août 2008, 15:44

[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…

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 août 2008, 16:08

  1. Jamais de SELECT *, on précise les champs à retourner
  2. Pas d'apostrophes sur des données numériques
  3. 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 ? ;)

Eléphant du PHP | 65 Messages

02 août 2008, 19:30

  1. Jamais de SELECT *, on précise les champs à retourner
  2. Pas d'apostrophes sur des données numériques
  3. 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]

Eléphant du PHP | 443 Messages

02 août 2008, 20:50

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.

Eléphant du PHP | 422 Messages

03 août 2008, 20:50

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)

Mammouth du PHP | 2937 Messages

03 août 2008, 22:52

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. ;)