テーブルに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 ...
メッセージ!これらの括弧はここで何をしますか?
EDIT2:
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テーブルを読んだ後、不可能なWHEREに気付きました
これは すでにリンクしたページ に記載されています。
MySQLはすべての
const
(およびsystem
)テーブルを読み取り、WHERE
句は常にfalseであることに注意してください
const
テーブルは次のように定義されます
テーブルには最大1つの一致する行があり、クエリの開始時に読み込まれます。 ...
const
は、_PRIMARY KEY
_またはUNIQUE
インデックスのすべての部分を定数値と比較するときに使用されます。
_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')
もこのインデックスを使用して対象の行を見つけることができます(ただし、一致する任意の行を評価するための残余述語がまだあります)。
他のクエリは異なります
_SELECT rid
FROM relationship
WHERE fromid = 60
AND toid = 78
AND is_approved = 's'
OR is_approved = 'f'
OR is_approved = 't'
_
AND
はOr
よりも優先順位が高いため、これは
_SELECT rid
FROM relationship
WHERE ( ( fromid = 60 ) AND ( toid = 78 ) AND ( is_approved = 's' ) )
OR ( is_approved = 'f' )
OR ( is_approved = 't' )
_
これはもはやそのインデックスを使用できず、any行を返すという意味で異なるセマンティクスを持っています。ここで、is_approved IN ('f','t')
の値は他の列があります。
MySql Explainは、提供された値を文字通り使用して、関連付けられたテーブルの行をトラバースします。関連するテーブルにない定数/キー値を指定すると、MySql Explainはこのエラーで停止します。存在する値について関連テーブルにクエリを実行し、Explainクエリでそれらを提供するだけで、すべてが期待どおりに機能します。
Impossible WHERE noticed after reading const tables
説明クエリで?
このエラーは、主キーまたは一意キーである列に無効な値が設定されているために発生します。
where
句の正しい値で試してください。
私はこれから遅くまで飛び込みます。しかし、ここに私が気づいたことがあります。
このクエリを実行していたところ、アイテム列は一意でした。
SELECT `vari-groupid` FROM shop_item_variations_group where `item` = 'itemnu1' limit 1
constテーブルを読んだ後に不可能なWHEREに気づく
私がしなければならなかったすべては「=」を「好き」に変更し、それは今私のインデックスを使用しています。
SELECT `vari-groupid` FROM shop_item_variations_group where `item` like 'itemnu1' limit 1