这个 MySQL IN 子句中的负值有啥问题?

Posted

技术标签:

【中文标题】这个 MySQL IN 子句中的负值有啥问题?【英文标题】:What's wrong with negative values in this MySQL IN clause?这个 MySQL IN 子句中的负值有什么问题? 【发布时间】:2011-03-02 05:13:10 【问题描述】:

我有这样的看法:

TABLE_TYPE
(code,name)
(1,'Computer')
(2,'Television')
(3,'Radio')

TABLE_THING
(code,name,type=TABLE_TYPE:code)
(-9999, 'ThingFirst',1)
(1,'Thing1',1)
(2,'Thing2',2)
(3,'Thing3',2)
(4,'Thing4',3)
(5,'Thing5',1)

VIEW_THINGS
(code,name,thingtype)
(-9999, 'ThingFirst','Computer')
(1,'Thing1','Computer')
(2,'Thing2','Television')
(3,'Thing3','Television')
(4,'Thing4','Radio')
(5,'Thing5','Computer')

查询:

select * from VIEW_THINGS where code in (-9999,1,2,3,4,5)

结果是:

(-9999, 'ThingFirst',NULL)

结果应该是:

(-9999, 'ThingFirst','Computer')
(1,'Thing1','Computer')
(2,'Thing2','Television')
(3,'Thing3','Television')
(4,'Thing4','Radio')
(5,'Thing5','Computer')

怎么了????

提示1:当我从 IN 子句中退出负值 (-9999) 时,我会得到:

(1,'Thing1','Computer')
(2,'Thing2','Television')
(3,'Thing3','Television')
(4,'Thing4','Radio')
(5,'Thing5','Computer')

提示2:如果我从总视图结果中进行选择,我会得到正确的数据:

select * from (select * from VIEW_THINGS as T) where code in (-9999,1,2,3,4,5)

结果:

(-9999, 'ThingFirst','Computer')
(1,'Thing1','Computer')
(2,'Thing2','Television')
(3,'Thing3','Television')
(4,'Thing4','Radio')
(5,'Thing5','Computer')

【问题讨论】:

SHOW CREATE TABLE TABLE_TYPE; SHOW CREATE TABLE TABLE_THING; SHOW CREATE TABLE VIEW_THINGS; 的输出是什么? 【参考方案1】:

完整的测试脚本:

create table TABLE_TYPE(code int,name varchar(20));
insert table_type values
(1,'Computer'),
(2,'Television'),
(3,'Radio');

create table TABLE_THING(code int,name varchar(20),type int);
insert table_thing values
(-9999, 'ThingFirst',1),
(1,'Thing1',1),
(2,'Thing2',2),
(3,'Thing3',2),
(4,'Thing4',3),
(5,'Thing5',1);

create table VIEW_THINGS(code int, name varchar(20),thingtype varchar(20));
insert view_things values
(-9999, 'ThingFirst','Computer'),
(1,'Thing1','Computer'),
(2,'Thing2','Television'),
(3,'Thing3','Television'),
(4,'Thing4','Radio'),
(5,'Thing5','Computer');

select * from VIEW_THINGS where code in (-9999,1,2,3,4,5);

输出

"code";"name";"thingtype"
"-9999";"ThingFirst";"Computer"
"1";"Thing1";"Computer"
"2";"Thing2";"Television"
"3";"Thing3";"Television"
"4";"Thing4";"Radio"
"5";"Thing5";"Computer"

既然这样有效,我会说 VIEW_THINGS 是一个连接两个表的视图。让我们看看

create view view_things2
as
select t.code, t.name, y.name thingtype
from table_thing t
inner join table_type y on y.code = t.type
;
select * from VIEW_THINGS2 where code in (-9999,1,2,3,4,5);

输出:如上

这是我们所能提供的信息。

【讨论】:

【参考方案2】:

你尝试过改变订单吗

SELECT * FROM VIEW_THINGS WHERE code IN (1,2,3,4,5,-9999)

【讨论】:

订单有什么问题 @Cris 我只是在问,在 mysql 中,IN 这个词是 = ANY 的别名,请尝试一下 如果他的桌子错了,我们该怎么办??我只是建议另一种方式...为什么不赞成:( 我没有对你投反对票,但我怀疑你被投反对票是因为IN 子句中的项目顺序对返回的结果完全没有影响。没有理由相信您的建议会有所帮助。

以上是关于这个 MySQL IN 子句中的负值有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

当列不明确时,有啥方法可以强制 Mysql 在 where 子句中使用 select 中的列?

MySQL中的空IN子句参数列表

MySQL“IN”子句中的逗号分隔值

按mysql中select语句“in”子句中的值顺序排序

IN子句中的MySQL多列

PHP,Python中的Mysql IN子句参数化