不可能在阅读const表后注意到了

时间:2012-07-20 13:44:15

标签: mysql inner-join

我的两张桌子未能加入。运行

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

4 个答案:

答案 0 :(得分:2)

你在哪里使用了错误的角色。将'替换为':

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

答案 1 :(得分:1)

这应该不是

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

答案 2 :(得分:1)

将'B.A_id'改为

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

答案 3 :(得分:0)

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

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

因此ql.equipment_id作为常量字符串给出。难怪MySQL将这种情况标记为“不可能”!

当我看到那些时,我需要更加眯眼!

感谢所有人的快速回复。