3
votes

MySQL renvoie des résultats erronés avec la clause BETWEEN

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 .

entrez la description de l'image ici


0 commentaires

3 Réponses :


2
votes

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.


2 commentaires

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.



4
votes

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'


0 commentaires

0
votes

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.


0 commentaires