У меня есть уникальный составной ключ, такой как fr (fromid, toid) в таблице, когда я запускаю запрос с объяснением, я получаю следующий результат:
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 таблиц
MySQL прочитал все const (и системные) таблицы и заметил, что предложение WHERE всегда ложно.
Но в запросе я получаю желаемый результат, а WHERE
часть - нет false
. Есть ли кто-то, кто мог бы объяснить это и пролить свет на эту тему?
SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;
возвращает ???using index
вместоimpossible...
Ответы:
Вы получаете сообщение
Это задокументировано на странице, на которую вы уже ссылались .
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')
независимо от значения в других столбцах.источник
fromid=12 AND toid=78
проверьте, еслиis_approved='f'
илиis_approved='t'
илиis_approved='s'
WHERE fromid=60 AND toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
который также можно записать в виде:WHERE fromid=60 AND toid=78 AND ( is_approved IN ('s', 'f', 't') )
fromid=60 AND toid=78
детали, поэтому дальнейшая проверка не требуется (дляis_approved
детали).(fromid,toid)
так что наверняка будет максимум один? И из сообщения, которое вы говорите, вы получаете MySQL, не думает, что есть даже тот, который делает. Вы имеете в виду, что у вас есть несколько совпадающих строкfromid=60
и несколько совпадающих,toid=78
но не обязательно одинаковых строк?AND-OR
путаница . Может быть, вы хотите, чтобы все строки, которые имеютfromid=60
и все строки, которые имеют,toid=78
а затем из них, оставляли только те, которые имеют или's'
или'f'
илиt'
is_approved? Если да, попробуйте это условие:WHERE (fromid=60 OR toid=78) AND (is_approved IN ('s', 'f', 't'))
MySql Explain использует предоставленные вами значения, в буквальном смысле, для обхода строк связанных таблиц. Если вы укажете значение константы / ключа, которого нет в связанной таблице, MySql Explain остановится с этой ошибкой. Просто запросите в соответствующих таблицах значения, которые существуют, и предоставьте их в вашем запросе объяснения, и все будет работать как положено.
источник
Impossible WHERE noticed ...
это не ошибка Это часть объяснения.Impossible WHERE noticed after reading const tables
в запросе объяснения?Эта ошибка возникает из-за того, что в столбец введено неверное значение, являющееся либо первичным, либо уникальным ключом.
Попробуйте с правильным значением в
where
предложении.источник
Я прыгаю в это поздно. Но вот что я заметил для себя.
Я делал этот запрос, и столбец элемента был УНИКАЛЬНЫМ.
который получил бы невозможное ГДЕ заметил после прочтения const таблиц
Все, что мне нужно было сделать, это изменить "=" на "нравится", и теперь он использует мой индекс.
источник
=
?