2012-09-22 7 views
3

J'ai repéré un problème MySQL bizarre aux deux différentes manières dont j'effectuais une requête. Lorsque vous faites bouillir tout vers le bas, cette façon retourne plus de résultats:Requête MySQL utilisant l'opérateur 'in': pourquoi différents résultats w/quotes?

SELECT DISTINCT <stuff> FROM <tables> 
WHERE promo_detail_store_id in (8214, 8217, 4952, 8194, ...) 

Cette modification de la clause WHERE produit un sous-ensemble de ces résultats:

WHERE promo_detail_store_id in ('8214, 8217, 4952, 8194, ...') 

(promo_detail_store_id est défini comme BIGINT dans une table MyISAM A l'origine cette liste de store_ids était beaucoup plus longue, et j'ai commencé à la couper de plus en plus courte en pensant peut-être qu'il y avait des limites étranges sur la longueur d'une chaîne. Mais non, cela vaut aussi pour de très petites chaînes/listes. Il est clair que quelque chose se passe dans les coulisses impliquant la coercition de type et peut-être comment fonctionne l'opérateur «in». Quelqu'un peut-il m'éclairer?

Répondre

10

WHERE promo_detail_store_id in (8214, 8217, 4952, 8194, ...)

signifie

WHERE promo_detail_store_id = 8214 
OR promo_detail_store_id = 8217 
OR promo_detail_store_id = 4952 
OR promo_detail_store_id = 8194 
OR ... 

WHERE promo_detail_store_id in ('8214, 8217, 4952, 8194, ...') 

signifie

WHERE promo_detail_store_id = '8214, 8217, 4952, 8194, ...' 

'8214, 8217, 4952, 8194, ...' jetteront au numéro à 8214, il sera

WHERE promo_detail_store_id = 8214 
3

La deuxième condition est effectivement équivalent à WHERE promo_detail_store_id IN (8214), parce que vous comparez un BIGINT à un TEXT et le texte est jeté à une valeur entière, qui ne tient pas compte tout du premier caractère non numérique à la fin de la chaîne

Questions connexes