У меня есть 3 разных SQL-запроса из 3 разных несвязанных таблиц (все используют LIMIT и ORDER BY).
Я хотел бы объединить и отсортировать результаты в соответствии с полем "дата" (которое появляется во всех них)
Что такое SQL?
У меня есть 3 разных SQL-запроса из 3 разных несвязанных таблиц (все используют LIMIT и ORDER BY).
Я хотел бы объединить и отсортировать результаты в соответствии с полем "дата" (которое появляется во всех них)
Что такое SQL?
Лучший способ - создать новую таблицу, содержащую общие поля из трех других таблиц, и добавить индекс в общее поле даты. Исходные три таблицы должны содержать внешний ключ, связанный с общей таблицей. С этой конструкцией запрос становится простым:
SELECT *
FROM common_table
ORDER BY "date" DESC
LIMIT 100
Если вам нужны данные из более конкретных таблиц, вы можете использовать LEFT JOINs, чтобы также выбирать эти данные в одном запросе.
Если вы не можете изменить свой дизайн и производительность, это не проблема, вы можете использовать UNION ALL для объединения результатов из всех трех таблиц перед сортировкой:
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
UNION ALL
SELECT * FROM table3
ORDER BY "date" DESC
LIMIT 100
Обратите внимание, что вышеизложенное будет работать только в том случае, если все таблицы имеют одинаковую структуру. Если у вас есть поля, которые встречаются в одной таблице, но не в других, вы должны опустить их из SELECT или вернуть NULL для этого столбца в других таблицах. Например, если:
table1
имеет столбцы a
, b
, c
и date
.table2
имеет столбцы b
, c
и date
.table3
имеет столбцы a
, c
и date
.Затем используйте это:
SELECT a, b, c, "date"
FROM table1
UNION ALL
SELECT NULL AS a, b, c, "date"
FROM table2
UNION ALL
SELECT a, NULL as b, c, "date"
FROM table3
ORDER BY "date" DESC
LIMIT 100
SELECT.....
UNION ALL
SELECT....
UNION ALL
SELECT ...
ORDER BY date_field;
Для достижения максимальной производительности применяйте ORDER BY/LIMIT как можно дольше и избегайте его в подзапросах.