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.