2 votes

Obtenir moins de résultats que prévu avec la clause WHERE IN

Je teste cette requête:

SELECT log_veh_id,
    MONTH( log_fecha_tiempo ) AS mes,
    YEAR(log_fecha_tiempo ) AS anio,
    SUM( log_total ) AS suma
    FROM  `dat_fuel_log`
        WHERE log_veh_id IN ('1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24')
GROUP BY MONTH( log_fecha_tiempo ) , YEAR( log_fecha_tiempo ) 
ORDER BY log_fecha_tiempo DESC

Et je n'obtiens que quelques résultats:

+------------+------+------+--------+
| log_veh_id | mes  | anio | suma   |
+------------+------+------+--------+
|          1 |    9 | 2017 |  85.00 |
|          1 |    8 | 2017 | 146.32 |
|          1 |    7 | 2017 | 187.26 |
|          1 |    6 | 2017 | 257.81 |
|          1 |    5 | 2017 | 263.65 |
|          1 |    4 | 2017 | 152.73 |
|          1 |    3 | 2017 | 193.28 |
|          1 |    2 | 2017 | 222.33 |
|          1 |    1 | 2017 | 114.02 |
+------------+------+------+--------+

Il y a beaucoup plus de log_veh_id = 1 et d'autres IDs (log_veh_id) qui satisfont la clause WHERE IN, pas seulement des 1.

Étant donné que toutes les valeurs log_veh_id seront effectivement dans les valeurs (WHERE IN), je m'attends à ce que tous les résultats de la table soient retournés comme si je supprimais la clause WHERE IN.

2voto

scaisEdge Points 87483

Si le log_veh_id est un INT, vous ne devriez pas utiliser de guillemets autour des valeurs dans IN mais

SELECT log_veh_id,
    MONTH( log_fecha_tiempo ) AS mes,
    YEAR(log_fecha_tiempo ) AS anio,
    SUM( log_total ) AS suma
    FROM  `dat_fuel_log`
        WHERE log_veh_id IN (1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
GROUP BY MONTH( log_fecha_tiempo ) , YEAR( log_fecha_tiempo ) 
ORDER BY log_fecha_tiempo DESC

sinon si c'est un char, alors vous devriez citer chaque valeur

SELECT log_veh_id,
    MONTH( log_fecha_tiempo ) AS mes,
    YEAR(log_fecha_tiempo ) AS anio,
    SUM( log_total ) AS suma
    FROM  `dat_fuel_log`
        WHERE log_veh_id IN ('1','2','3','4','5','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24')
GROUP BY MONTH( log_fecha_tiempo ) , YEAR( log_fecha_tiempo ) 
ORDER BY log_fecha_tiempo DESC

0voto

E. Villiger Points 719

Cette réponse est censée être complémentaire aux autres réponses/commentaires :

Si les identifiants sont tous séquentiels, vous pouvez également utiliser simplement :

WHERE log_veh_id BETWEEN 1 AND 24

Si pour une raison quelconque vous ne pouvez pas convertir la liste délimitée par des virgules en entiers individuels, la fonction correspondante pour une chaîne serait :

WHERE FIND_IN_SET(log_veh_id, '1,2,3,4,5,...') > 0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X