MySQL WHERE EXISTS 不工作

Posted

技术标签:

【中文标题】MySQL WHERE EXISTS 不工作【英文标题】:MySQL WHERE EXISTS not working 【发布时间】:2016-12-03 15:11:42 【问题描述】:

我正在使用 Doctrine 和 Zend Framework 2 来使用子查询对我的发票表进行查询。

这是简化的生成 SQL 并填写了参数

SELECT *

FROM invoices i1 

WHERE (EXISTS (SELECT * FROM invoices i2 WHERE i2.invoice_first_name IN ('stephen') OR i2.invoice_middle_name IN ('stephen') OR i2.invoice_surname IN('stephen')))

ORDER BY i1.invoice_id DESC

我遇到的问题是,当我在 phpMyAdmin 中运行此查询时,它会返回所有发票,即使是那些不包含名称“斯蒂芬”的发票。

但是,当我单独运行子查询时,它会返回 2 行,这是正确的。

SELECT * FROM invoices i2 WHERE i2.invoice_first_name IN ('stephen') OR i2.invoice_middle_name IN ('stephen') OR i2.invoice_surname IN('stephen')

那么为什么子查询不适用于EXISTS,我错过了什么?

非常感谢。

【问题讨论】:

【参考方案1】:

根据mysql documentation:

如果子查询返回任何行,EXISTS 子查询为 TRUE,NOT EXISTS 子查询为 FALSE

由于您的子查询返回一些行,因此 where 子句为真 - 对于发票表中的 每一 行。

【讨论】:

以上是关于MySQL WHERE EXISTS 不工作的主要内容,如果未能解决你的问题,请参考以下文章

mysql中exists的用法详解

SQL 无法让 WHERE EXISTS 子句正常工作,并且仅返回在特定日期内具有客户端类型的行

sql 查询的正确语法和 WHERE EXISTS 替代方案

MySQL Where Not Exists 根据 3 个值插入记录

MySql:WHERE NOT EXISTS(跳过重复项)与 group by

EXISTS 子句在 SQL Server 中如何工作?