J'utilise la requête suivante pour obtenir des données de la base de données mysql et je reçois des données erronées. Je veux afficher release_year de 1990 à 2000, mais il me montre tout.
SELECT title,release_year FROM FILMS WHERE release_year BETWEEN 1990 AND 2000 AND budget > 1000000000 AND language ='Spanish' OR language = 'French';
J'ai essayé de changer l'ordre de la requête mais cela ne semblait pas fonctionner ou j'ai essayé d'ajouter des parenthèses à release_year entre 1990 ET 2000
.
3 Réponses :
C'est toujours une bonne idée de forcer la priorité logique et
et ou
.
Essayez:
SELECT title,release_year FROM FILMS WHERE release_year between 1990 AND 2000 AND budget > 1000000000 AND language IN ('Spanish', 'French') ;
ou
SELECT title,release_year FROM FILMS WHERE release_year between 1990 AND 2000 AND budget > 1000000000 AND (language ='Spanish' OR language = 'French') ;
Les versions récentes de MySQL ont apporté des optimisations à IN
qui peuvent le rendre plus performant que l'ensemble équivalent de OU
conditions.
Remarque, je dis "toujours" car même si (a et b) ou c
étaient votre logique prévue, l'ajout de parenthèses indique clairement votre intention à la prochaine personne qui examine la requête.
Avez-vous une référence pour votre commentaire sur les optimisations de IN
? Je serais intéressé de voir ce qu'ils ont fait (pas qu'ils auraient à faire beaucoup étant donné à quel point les performances OR
ont tendance à être mauvaises).
@Nick Je n'ai pas vraiment de référence pour ça; c'est juste quelque chose que j'ai vu d'autres contributeurs fiables dire ici.
Vous avez un problème de présence logique .
Voici vos conditions de filtrage:
release_year BETWEEN 1990 AND 2000 AND budget > 1000000000 AND language IN ('Spanish', 'French')
Dans les opérateurs logiques, OU a une préséance inférieure à
AND
, donc c'est syntaxiquement équivalent à:
release_year BETWEEN 1990 AND 2000 AND budget > 1000000000 AND ( language ='Spanish' OR language = 'French')
Vous pouvez maintenant voir que cette expression autorisera n'importe quel film français , indépendamment de son année de sortie et de son budget.
Vous voudrez probablement:
( release_year BETWEEN 1990 AND 2000 AND budget > 1000000000 AND language ='Spanish' ) OR language = 'French'
Ce qui peut être raccourci comme suit:
release_year BETWEEN 1990 AND 2000 AND budget > 1000000000 AND language ='Spanish' OR language = 'French'
Essayez ceci ..
SELECT title,release_year FROM FILMS WHERE release_year >= 1990 AND release_year <= 2000 AND budget > 1000000000 AND (language ='Spanish' OR language = 'French');
Si vous avez des questions, veuillez commenter ci-dessous.