Задать вопрос
@yurasek

Почему некорректно работает запрос при использовании UNION в хранимой процедуре в MySQL?

Если в хранимой процедуре с таким запросом всё работает корректно (возвращается одно число и NULL):
begin
 select min(time) t from params where counter_id = 11858 and time >= 3629232000000 union 
 select max(time) t from params where counter_id = 11858 and time < 3629232000000;
end

Результат:
  • 3630948355222
  • (NULL)

А вот с дополнительным селектом код в хранимой процедуре возвращает результат только второго селекта (после UNION):
begin
 select * from (
  select max(time) t from params where counter_id = 11858 and time < 3629232000000 union 
  select min(time) t from params where counter_id = 11858 and time >= 3629232000000) a;
end

Результат:
  • (NULL)

Перестановка селектов между UNION в последнем коде приводит только к смене единственного возвращаемого результата.
Не могу понять почему так происходит?
  • Вопрос задан
  • 313 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@dmitryKovalskiy
программист средней руки
UPD:
--Был мусор... 

IF EXISTS(select MAX(time) FROM params WHERE...)
BEGIN 
--Выборка
END
ELSE
BEGIN 
SELECT MIN(time) FROM params WHERE...
END

Решение в лоб.
Ответ написан
@yurasek Автор вопроса
Вот пример Explain для запроса без проблемы:
bd6c1cf9707ae6834c84642ed1d5f833.png
Вот пример Explain для запроса с проблемой:
206bef2411f0a42c88a716360618fa1a.png
Вот такой странный запрос возвращает правильный (нужный) результат:
deb9e1f3423429d5704d6c7c74d16ed6.png
Вот такой запрос работает корректно, возвращая 1 и NULL:
select * from (select 1 union select NULL) a
Опытным путём удалось выяснить следующее: проблема с union повторяется только тогда, когда для столбцов counter_id и time созданы индексы с порядком counter_id > time и counter_id < time.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы