более эффективный способ достижения этого результата:
(SELECT s.start AS `date`
, s.name AS `name`
FROM my_table s
WHERE s.start > CURDATE() - INTERVAL 0 DAY
ORDER BY s.start
LIMIT 10
)
UNION ALL
(SELECT e.end AS `date`
, NULL AS `name`
FROM my_table e
WHERE e.end > CURDATE() - INTERVAL 0 DAY
ORDER BY e.end
LIMIT 10
)
ORDER BY `date`
LIMIT 10
ПРИМЕЧАНИЯ: Поскольку максимальное число строки, которые нужно вернуть, равны 10, нам нужно вернуть только 10 строк с датой start
и 10 строк с датой end
. Это позволит избежать создания огромного набора результатов, который MySQL должен будет сортировать («Using filesort»), чтобы получить их в правильном порядке.
Мы также можем избежать внешнего выбора с использованием «неявной» операции UNION ALL. (Это расширение MySQL к стандарту SQL, не требующего внешнего запроса.)
Мы включаем значение name
колонки вместе с start
датами, и включают в себя статический фиктивное значение для name
колонки с end
даты. Мы делаем это так, чтобы удовлетворить требованиям операции UNION ALL
(т. Е. Количество столбцов и типов данных столбцов должно совпадать.) Мы могли бы просто предоставить пустую строку или любое другое литеральное значение вместо NULL.
MySQL может удовлетворять запросу очень эффективно, если доступны подходящие индексы, например.
... ON my_table (`start`,`name`)
... ON my_table (`end`)
Мы предполагаем, что start
и end
являются тип данных DATE
. Если они хранятся как VARCHAR
, мы хотим изменить выражение в правой части сравнения неравенств в запросах, чтобы они возвращали совместимые и сопоставимые типы данных и значения.
Я не понимаю исходную таблицу данных, которую вы запрашиваете. – johnny
Извините, ошибся. Я редактировал сообщение. – Xinel
Я не вижу оригинальную таблицу. Это верх. Если так, я теряюсь, извините. – johnny