我在表中有一个唯一的复合键,例如 fr(fromid,toid),当我使用 explain 运行查询时,我得到以下结果:
Impossible WHERE noticed after reading const tables`
我运行的查询:
explain SELECT rid FROM relationship WHERE fromid=78 AND toid=60
有什么帮助吗?
EDIT1:
当我使用以下查询时:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND is_approved='s' OR is_approved='f' OR is_approved='t'
我看到USING WHERE
而不是上一条消息,但是当我使用以下查询时:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
我再次收到第一impossible ...
条消息!这些括号在这里做什么?
编辑2:
CREATE TABLE `relationship` (
`rid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fromid` mediumint(8) unsigned NOT NULL,
`toid` mediumint(8) unsigned NOT NULL,
`type` tinyint(3) unsigned NOT NULL,
`is_approved` char(1) NOT NULL,
PRIMARY KEY (`rid`),
UNIQUE KEY `fromid` (`fromid`,`toid`),
KEY `toid` (`toid`),
CONSTRAINT `relationship_ibfk_1` FOREIGN KEY (`fromid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `relationship_ibfk_2` FOREIGN KEY (`toid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
EDIT3:
正如mysql网站所说:
阅读 const 表后注意到不可能的 WHERE
MySQL 已读取所有 const(和系统)表并注意到 WHERE 子句始终为 false。
但是在查询中我得到了我想要的结果,这WHERE
部分不是false
. 有没有人可以解释这一点并阐明这个问题?
您正在收到消息
这记录在您已链接的页面中。
const
表定义为你有一个
UNIQUE KEY
. 可以通过读取这个唯一索引来满足(fromid,toid)
查询。WHERE fromid=78 AND toid=60
从您收到的消息中,这必须不返回任何结果。类似地,查询
WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
也可以使用这个索引来定位感兴趣的行(尽管它仍然有一个剩余谓词来评估任何要匹配的行)。您的其他查询不同
AND
的优先级高于Or
,因此与 相同这不能再使用该索引并且具有不同的语义,因为它将返回任何行,
is_approved IN ('f','t')
而不管其他列中的值是什么。MySql Explain 使用您提供的值来遍历关联表的行。如果您提供的常量/键值不在关联表中,MySql Explain 将停止并出现此错误。只需在关联表中查询确实存在的值并在您的解释查询中提供这些值,一切都会按预期工作。
Impossible WHERE noticed after reading const tables
在解释查询中?发生此错误的原因是在主键或唯一键的列上放置了无效值。
尝试在
where
子句中使用正确的值。我跳到这么晚了。但这是我注意到的。
我正在做这个查询,项目列是唯一的。
在阅读 const 表后会注意到 Impossible WHERE
我所要做的就是将“=”更改为“喜欢”,它现在正在使用我的索引。