【问题标题】:Impossible WHERE noticed after reading const tables阅读 const 表后注意到不可能的 WHERE
【发布时间】:2012-07-20 13:44:15
【问题描述】:

我的两个表无法加入。跑步

EXPLAIN SELECT  `A`.`id` 
FROM  `demo`.`A` AS  `A` 
INNER JOIN  `demo`.`B` AS  `B` 
ON (  `A`.`id` = 'B.A_id' )

产量

extra="Impossible WHERE noticed after reading const tables"

在结果中。我所有的研究都表明,这条消息应该意味着其中一个表是空的,或者 where 条件包含一些永远无法满足的条件,例如“where 1=0”。

为了隔离问题,我创建了数据库的副本并删除了所有内容,但复制问题所需的表和行除外。为了消除可能出现的问题,我删除了其中一张表上的所有索引。

我什至尝试过:

mysql> select * from A where id=23;
+----+
| id |
+----+
| 23 |
+----+
1 row in set (0.00 sec)

mysql> select * from B where A_id=23;
+------+------+
| A_id | B_id |
+------+------+
|   23 |   10 |
|   23 |   13 |
+------+------+
2 rows in set (0.00 sec)

所以这个连接应该至少产生一行。有些东西必须被打破,但我不知道是什么。

https://gist.github.com/3150634

【问题讨论】:

    标签: mysql inner-join


    【解决方案1】:

    您在 where 条件中使用了错误的字符。用`替换':

    SELECT  `A`.`id` 
    FROM  `demo`.`A` AS  `A` 
    INNER JOIN  `demo`.`B` AS  `B` 
    ON (  `A`.`id` = `B`.`A_id` )
    

    【讨论】:

      【解决方案2】:

      不应该这样

      ON (  `A`.`id` = `B`.`A_id` )
      

      ?

      【讨论】:

        【解决方案3】:

        把'B.A_id'改成

        EXPLAIN SELECT  `A`.`id`  
        FROM  `demo`.`A` AS  `A`  
        INNER JOIN  `demo`.`B` AS  `B`  
        ON (  `A`.`id` = `B`.`A_id' ) 
        

        【讨论】:

          【解决方案4】:

          我终于弄清楚发生了什么。在原始查询中,CakePHP 生成了

          ... ON (  `Equipment`.`id` = 'ql.equipment_id' AND ...
          

          所以 ql.equipment_id 以常量字符串的形式给出。难怪 MySQL 将条件标记为“不可能”!

          当我看到这些时,我需要更加眯起眼睛!

          感谢大家的快速回复。

          【讨论】:

            猜你喜欢
            • 2017-01-26
            • 2013-02-03
            • 2013-12-03
            • 2016-10-05
            • 2023-03-07
            • 2016-09-14
            • 2012-12-16
            • 2017-09-24
            • 2017-07-11
            相关资源
            最近更新 更多