3

我在执行查询的两种不同方式中发现了一个奇怪的 MySQL 问题。当你把所有东西都归结起来时,这种方式会返回更多结果:

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

对 WHERE 子句的这种更改会产生这些结果的一个子集:

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

(promo_detail_store_id 在 MyISAM 表中定义为 BIGINT。)

最初 store_ids 的列表要长得多,我开始把它剪得越来越短,我想也许对字符串的长度有一些奇怪的限制。但是不,它也适用于非常小的字符串/列表。很明显,幕后发生了一些事情,涉及类型强制以及“in”运算符的工作方式。有人可以启发我吗?

4

2 回答 2

10

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

方法

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, ...')

方法

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

'8214, 8217, 4952, 8194, ...'将转换为 number to be 8214,所以它将是

WHERE promo_detail_store_id = 8214
于 2012-09-22T16:00:47.847 回答
3

第二个条件实际上等效于WHERE promo_detail_store_id IN (8214),因为您将 aBIGINT与 a进行比较,TEXT并且将文本转换为整数值,这会忽略从第一个非数字字符到字符串末尾的所有内容。

于 2012-09-22T16:01:28.470 回答