Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建一个';逆';从mysql查询中选择_Mysql - Fatal编程技术网

创建一个';逆';从mysql查询中选择

创建一个';逆';从mysql查询中选择,mysql,Mysql,我在一个表上有一个长而复杂的mysql查询,其中有很多“where FieldX类似于“%ABC%”,还有一些“where FieldX不类似于“%efg%”。如果不进行大量的搜索和替换以将喜欢更改为不喜欢,反之亦然,那么我是否可以进行一些简单的查询来选择不符合大型查询参数的记录,而不是按照设计的方式选择的记录 简单的例子: 我有一个名为Letter的表,其中有26条记录,每个字母对应一条记录 然后我有一个查询,它说: Select * from TableA where `Letter`

我在一个表上有一个长而复杂的mysql查询,其中有很多“where FieldX类似于“%ABC%”,还有一些“where FieldX不类似于“%efg%”。如果不进行大量的搜索和替换以将喜欢更改为不喜欢,反之亦然,那么我是否可以进行一些简单的查询来选择不符合大型查询参数的记录,而不是按照设计的方式选择的记录

简单的例子:

  • 我有一个名为
    Letter
    的表,其中有26条记录,每个字母对应一条记录
然后我有一个查询,它说:

Select * from TableA where `Letter` = 'A' or `Letter` = 'B' or `Letter` = 'C' or or `Letter` = 'D' or `Letter` = 'E' or `Letter` = 'F' or `Letter` not like 'G' or `Letter` not like 'H'
现在,不再执行搜索和替换,而是反转/否定我的所有“where”条件:

Select * from TableA where `Letter` != 'A' or `Letter` != 'B' or `Letter` != 'C' or or `Letter` != 'D' or `Letter` != 'E' or `Letter` != 'F' or `Letter` like 'G' or `Letter` like 'H'
我只想使用现有的查询并得到相同的结果。我想可能有办法添加一个select或其他修改器来选择除原始select中的记录外的所有记录:

Select * from TableA where `Letter` != (Select * from TableA where `Letter` != 'A' or `Letter` != 'B' or `Letter` != 'C' or or `Letter` != 'D' or `Letter` != 'E' or `Letter` != 'F' or `Letter` not like 'G' or `Letter` not like 'H')

Cleary我不确定我的最后一个例子是否可以使用Mysql,但这是我的目标;将我的原始查询封装在另一个查询中,该查询将返回原始查询中未选择的所有记录。

首先,在反转比较时,您还必须将
更改为
,否则您将获得表中的所有记录。一切都不是“A”或“B”。:)

应该是:

Select * from TableA where `Letter` != 'A' and `Letter` != 'B' and ...
回到问题,我认为最简单的解决方案是将整个条件括在括号中,并添加一个
not
运算符:

Select * from TableA where not (`Letter` = 'A' or `Letter` = 'B' or ....)
GolezTrol的“
where not()
”答案是正确的,只要不涉及
NULL
。如果这个方法有效的话,你可以试试,但它只适用于小桌子,而且在大桌子上会变慢

select * from TableA as results 
where not exists 
( 
    select * from TableA as notResult where notResult.id = results.id and (Letter = 'A or Letter = 'B' ...) 
)

您可以添加查询和表结构吗?问题不太清楚。您希望得到什么?请编辑您的查询并添加简化版本的查询,以及示例数据和所需结果。要明确地理解你的意思有点困难。还有,一个查询在一个表上可以有多长时间和复杂度?我希望这会有所帮助。查询,特别是长的和复杂的查询,允许在其中有换行符。如果涉及任何
NULL
,请小心,因为
NULL='a'
不是真的(但是
NULL
),但是
notnull='a'
也不是真的(但是NULL)。所以两个选项中都不会有NULL。@flaschenpost您当然是对的。我故意忽略了这一点,因为它似乎不适用于OP的情况,也不使它变得更复杂。但为了完整起见,我应该提到它。我只是想添加这些信息,因为我有点困惑(这占用了我一些时间),当您拥有所有条目时,结果集通常是不完整的
where(condition)
where not(condition)