#mysql
#mysql
Вопрос:
Рассмотрим следующий запрос:
SELECT i.id AS item_id,
i.name,
i.project_id,
iv.id AS variation_id,
iv.price
FROM items AS i
JOIN items_variations AS iv ON iv.id = (
SELECT ivv.id FROM items_variations AS ivv
JOIN items_pictures AS ip2
ON ip2.variation_id = ivv.id
AND (( ip2.thumb = 1 AND ip2.details = 1 AND ip2.visible = 1 AND ip2.format = 3 )
OR ( ip2.cover = 1 AND ip2.details = 1 AND ip2.visible = 1 AND ip2.format = 3 ) )
WHERE ivv.item_id = i.id AND ivv.status = 1
ORDER BY ivv.price ASC
LIMIT 1)
WHERE i.id = 60
Он возвращает пустой набор. Если я удалю поле iv.price из предложения select, то будет возвращена одна строка.
Я довольно удивлен таким поведением, у вас есть какие-либо подсказки о ТОМ, ПОЧЕМУ это происходит?
В настоящее время я использую mysql версии 14.14, дистрибутив 5.5.28, для Linux (x86_64) с использованием readline 5.1
Комментарии:
1. @fancyPants удалить из обязательных полей.
2. извините, если я плохо объяснился, я имел в виду удалить из предложения select
3. Попробуйте перестроить индексы. Если ваши индексы повреждены, включение столбца может привести к выбору другого (поврежденного) индекса и, следовательно, не вернуть правильные данные. Я понятия не имею, может ли MySQL иметь поврежденные индексы или как их перестроить, но это единственная причина, которая дала бы такой эффект.
4. IDK, если это просто я в последнее время не так часто использовал MySQL, но ваш запрос выглядит необязательно сложным для того, чего вы пытаетесь достичь. Ваши две строки И / ИЛИ условия в соединении могут быть сокращены до
AND ((ip2.thumb = 1 OR ip2.cover = 1) AND ip2.details = 1 AND ip2.visible = 1 AND ip2.format = 3)
, например5. @AeroX вы правы, это запрос, который я написал давным-давно, и сегодня мне пришлось использовать его снова через некоторое время … и я обнаружил, что это неприятный сюрприз. Я уверен, что могу переписать запрос, чтобы избежать проблемы, но мне было любопытно узнать причину этого