MYSQL 解释给出 "Impossible WHERE"和 SELECT Count(x) 查询

标签 mysql database select where-clause

我似乎在 SELECT 查询中遇到了“不可能的 WHERE”。我在下面发布了两个查询,它们在子查询中有所不同。这些查询的作用是在更新计数之前检查用户之前是否保存过某些内容。我使用 SELECT 进行测试,但实际查询将使用 UPDATE:

UPDATE articles SET article_count = article_count+1 
WHERE id = 2343243 AND (
    SELECT COUNT(*) 
    FROM posts as p
    WHERE p.post_id = 2343243 AND p.user_id = 3
) = 1;

以下两个查询是我用来测试数据是否在表中的查询(仅用于测试):

EXPLAIN 
SELECT a.id 
FROM articles as a 
WHERE a.id = 2343243 AND (
    SELECT COUNT(*) 
    FROM posts as p
    WHERE p.post_id = a.id AND p.user_id = 3
) = 1;

查询 1 在 EXPLAIN 中返回 Impossible WHERE。 查询 #2 的 select_type 是 SUBQUERY。

EXPLAIN 
SELECT a.id 
FROM articles as a 
WHERE a.id = 2343243 AND (
    SELECT COUNT(*) 
    FROM posts as p
    WHERE p.post_id = 2343243 AND p.user_id = 3
) = 1;

查询 2 返回在 EXPLAIN 中读取 const 表后注意到的不可能的地方查询 2 的 select_type 是 DEPENDENT SUBQUERY。

问题:关于如何使这不是一个不可能的 WHERE 查询,有什么想法吗?而且,哪个会更快?

最佳答案

在 Mysql.com 上阅读了有关 Impossible WHERE 的内容后,发现在查询中使用 WHERE 1 = 1 这样的约束并不是一个好主意:

Because it is never possible for this condition to be true, the EXPLAIN statement will show the words Impossible WHERE. Informally, we at MySQL say that the WHERE has been optimized away.

Mysql.com:http://dev.mysql.com/doc/internals/en/optimizer-eliminating-dead-code.html

我决定放弃该查询,转而使用我编写的新查询,该查询对主查询和子查询都使用索引,这是一个更快的解决方案,而且看起来不太复杂:

UPDATE articles 
SET article_count = IF (
    (SELECT count(*) FROM posts WHERE post_id = 2343243 AND user_id = 3) = 1, article_count+1, article_count) 
WHERE id = 2343243;

关于MYSQL 解释给出 "Impossible WHERE"和 SELECT Count(x) 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11999243/

相关文章:

linq - LINQ 语句中的 Select 是可选的吗?

mysql - 删除 SELECT Mysql 结果中的重复项,如果任何列 1 = 列 2 那么它是重复项

java - Facelet 不传递来自 <h :inputText> 的信息

mysql - 无法使用 SSIS 将 SQL Server varchar(max) 传输到 MySQL 文本

mysql - 'fantasy football' 数据库中结果表的正确数据库结构

MySQL选择与其他列相比具有唯一列值的行

mysql - 为什么这个 mysql 例程总是在 XAMPP 的 phpmyadmin sql 控制台中返回 false?

ruby-on-rails - sort_by 与子查询花费太长时间

c# - 告诉我的网站某些内容已更新的数据库触发器

javascript - 在另一个 <select> 框中选择时禁用 <select> 选项