Tengo una clave compuesta única como fr (fromid, toid) en la tabla, cuando ejecuto la consulta con explicar obtengo el siguiente resultado:
Impossible WHERE noticed after reading const tables`
La consulta que ejecuté:
explain SELECT rid FROM relationship WHERE fromid=78 AND toid=60
¿Alguna ayuda?
EDITAR1:
cuando uso la siguiente consulta:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND is_approved='s' OR is_approved='f' OR is_approved='t'
Veo en USING WHERE
lugar del mensaje anterior, pero cuando uso la siguiente consulta:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
De nuevo recibo el primer impossible ...
mensaje! ¿Qué hacen estos paréntesis aquí?
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
EDITAR3:
Como dice el sitio mysql:
Imposible DONDE se notó después de leer tablas const
MySQL ha leído todas las tablas const (y del sistema) y ha notado que la cláusula WHERE siempre es falsa.
Pero en la consulta obtengo el resultado que quiero, la WHERE
parte no lo es false
. ¿Hay alguien que pueda explicar esto y arrojar algo de luz sobre el tema?
SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;
devuelve?using index
en lugar deimpossible...
Respuestas:
Estas recibiendo el mensaje
Esto está documentado en la página que ya ha vinculado .
const
las tablas se definen comoTienes un
UNIQUE KEY
encendido(fromid,toid)
. La consultaWHERE fromid=78 AND toid=60
se puede satisfacer leyendo este índice único. Del mensaje que está recibiendo esto no debe devolver resultados.De manera similar, la consulta
WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
también puede usar este índice para localizar la fila de interés (aunque todavía tiene un predicado residual para evaluar si alguna fila coincide).Su otra consulta es diferente
AND
tiene una precedencia mayor queOr
, por lo que es lo mismo queEsto ya no puede usar ese índice y tiene una semántica diferente, ya que devolverá cualquier fila donde
is_approved IN ('f','t')
sea que sean los valores en las otras columnas.fuente
fromid=12 AND toid=78
entonces verifique siis_approved='f'
ois_approved='t'
o?is_approved='s'
WHERE fromid=60 AND toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
que también se puede escribir como:WHERE fromid=60 AND toid=78 AND ( is_approved IN ('s', 'f', 't') )
fromid=60 AND toid=78
parte, no es necesario realizar más comprobaciones (para lais_approved
parte).(fromid,toid)
para que seguramente haya un máximo de uno? Y a partir del mensaje que dice que está recibiendo MySQL, no cree que haya siquiera uno que lo haga. ¿Quiere decir que tiene algunas filas que coincidenfromid=60
y algunas filas que coincidentoid=78
pero no necesariamente las mismas filas?AND-OR
confusión . ¿Quizás quiera todas las filas que tienenfromid=60
y todas las filas que tienentoid=78
y luego de ellas, mantener solo las que tienen's'
o está'f'
o estát'
aprobado? En caso afirmativo, intente esta condición:WHERE (fromid=60 OR toid=78) AND (is_approved IN ('s', 'f', 't'))
MySql Explain utiliza los valores que proporciona, literalmente, para recorrer las filas de las tablas asociadas. Si proporciona un valor constante / clave que no está en la tabla asociada, MySql Explain se detendrá con este error. Simplemente consulte en la (s) tabla (s) asociada (s) los valores que existen y proporcione aquellos en su consulta de Explain y todo funcionará como se espera.
fuente
Impossible WHERE noticed ...
No es un error. Es parte de la explicación.Impossible WHERE noticed after reading const tables
en explicar consulta?Este error se produce debido a que se coloca un valor no válido en una columna que es clave principal o clave única.
Intente con un valor correcto en la
where
cláusula.fuente
Estoy entrando tan tarde. Pero aquí está lo que noté por mí.
Estaba haciendo esta consulta y la columna del elemento era ÚNICA.
que obtendría lo imposible DONDE se notó después de leer las tablas constantes
Todo lo que tenía que hacer era cambiar "=" a "me gusta" y ahora está usando mi índice.
fuente
=
?