J'ai une clé composée unique comme fr (fromid, toid) dans la table, lorsque j'exécute la requête avec expliquer, j'obtiens le résultat suivant:
Impossible WHERE noticed after reading const tables`
La requête que j'ai exécutée:
explain SELECT rid FROM relationship WHERE fromid=78 AND toid=60
De l'aide?
EDIT1:
Lorsque j'utilise la requête ci-dessous:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND is_approved='s' OR is_approved='f' OR is_approved='t'
Je vois à la USING WHERE
place du message précédent, mais lorsque j'utilise la requête ci-dessous:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
Je reçois à nouveau le premier impossible ...
message! Que font ces parenthèses ici?
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:
Comme le dit le site mysql:
Impossible O noticed remarqué après avoir lu les tables const
MySQL a lu toutes les tables const (et système) et remarque que la clause WHERE est toujours fausse.
Mais dans la requête j'obtiens le résultat que je veux, la WHERE
pièce ne l'est pas false
. Y a-t-il quelqu'un qui pourrait expliquer cela et faire la lumière sur le sujet?
SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;
revient ???using index
en extra au lieu deimpossible...
Réponses:
Vous recevez le message
Ceci est documenté dans la page que vous avez déjà liée .
const
les tables sont définies commeVous avez un
UNIQUE KEY
sur(fromid,toid)
. La requête surWHERE fromid=78 AND toid=60
peut être satisfaite en lisant cet index unique. Du message que vous obtenez, cela ne doit retourner aucun résultat.De même, la requête
WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
peut également utiliser cet index pour localiser la ligne d'intérêt (bien qu'il ait toujours un prédicat résiduel à évaluer si une ligne devait correspondre).Votre autre requête est différente
AND
a une priorité plus élevée queOr
, c'est donc la même chose queCela ne peut plus utiliser cet index et a une sémantique différente en ce sens qu'il renverra toutes les lignes où que
is_approved IN ('f','t')
soient les valeurs dans les autres colonnes.la source
fromid=12 AND toid=78
alors vérifier siis_approved='f'
ouis_approved='t'
ouis_approved='s'
WHERE fromid=60 AND toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
qui peut aussi s'écrire:WHERE fromid=60 AND toid=78 AND ( is_approved IN ('s', 'f', 't') )
fromid=60 AND toid=78
pièce, aucune vérification supplémentaire n'est nécessaire (pour lais_approved
pièce).(fromid,toid)
donc il y en aurait sûrement un maximum? Et d'après le message que vous dites que vous obtenez MySQL, vous ne pensez pas qu'il y en ait même un. Voulez-vous dire que vous avez des lignes qui correspondentfromid=60
et des lignes qui correspondent,toid=78
mais pas nécessairement les mêmes lignes?AND-OR
confusion . Peut-être que vous voulez toutes les lignes qui ontfromid=60
et toutes les lignes qui onttoid=78
et ensuite de celles-ci, ne gardez que celles qui ont's'
ou'f'
out'
est_approuvé? Si oui, essayez cette condition:WHERE (fromid=60 OR toid=78) AND (is_approved IN ('s', 'f', 't'))
MySql Explain utilise littéralement les valeurs que vous fournissez pour parcourir les lignes des tables associées. Si vous fournissez une valeur constante / clé qui n'est pas dans la table associée, MySql Explain s'arrêtera avec cette erreur. Recherchez simplement les tables associées pour les valeurs qui existent et fournissez-les dans votre requête Explain et tout fonctionnera comme prévu.
la source
Impossible WHERE noticed ...
n'est pas une erreur. Cela fait partie de l'explication.Impossible WHERE noticed after reading const tables
dans expliquer la requête?Cette erreur se produit en raison de la valeur non valide placée sur une colonne qui sont soit la clé primaire soit la clé unique.
Essayez avec une valeur correcte dans la
where
clause.la source
Je saute trop tard. Mais voici ce que j'ai remarqué pour moi.
Je faisais cette requête et la colonne de l'article était UNIQUE.
qui obtiendrait l' impossible où remarqué après avoir lu les tables const
Tout ce que j'avais à faire était de changer "=" en "j'aime" et il utilise maintenant mon index.
la source
=
?