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 USING WHERE
au lieu 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 partie WHERE
n'est pas false
. Y a-t-il quelqu'un qui pourrait expliquer cela et faire la lumière sur le sujet?
Vous recevez le message
Impossible O noticed remarqué après avoir lu les tables const
Ceci est documenté dans la page que vous avez déjà liée .
MySQL a lu toutes les tables
const
(etsystem
) et remarque que la clauseWHERE
est toujours fausse
const
les tables sont définies comme
La table a au plus une ligne correspondante, qui est lue au début de la requête. ...
const
est utilisé lorsque vous comparez toutes les parties d'un indexPRIMARY KEY
ouUNIQUE
à des valeurs constantes.
Vous avez un UNIQUE KEY
Sur (fromid,toid)
. La requête sur WHERE 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'elle ait toujours un prédicat résiduel à évaluer si une ligne devait correspondre).
Votre autre requête est différente
SELECT rid
FROM relationship
WHERE fromid = 60
AND toid = 78
AND is_approved = 's'
OR is_approved = 'f'
OR is_approved = 't'
AND
a une priorité plus élevée que Or
, c'est donc la même chose que
SELECT rid
FROM relationship
WHERE ( ( fromid = 60 ) AND ( toid = 78 ) AND ( is_approved = 's' ) )
OR ( is_approved = 'f' )
OR ( is_approved = 't' )
Cela ne peut plus utiliser cet index et a une sémantique différente en ce qu'il retournera toutes les lignes où is_approved IN ('f','t')
quelles que soient les valeurs les autres colonnes le sont.
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 ne figure pas dans la table associée, MySql Explain s'arrête 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.
Impossible WHERE noticed after reading const tables
dans la requête d'explication?
Cette erreur se produit en raison d'une 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 clause where
.
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.
SELECT `vari-groupid` FROM shop_item_variations_group where `item` = 'itemnu1' limit 1
qui obtiendrait le Impossible O noticed 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.
SELECT `vari-groupid` FROM shop_item_variations_group where `item` like 'itemnu1' limit 1