Ответ 1
Лучший способ - создать новую таблицу, содержащую общие поля из трех других таблиц, и добавить индекс в общее поле даты. Исходные три таблицы должны содержать внешний ключ, связанный с общей таблицей. С этой конструкцией запрос становится простым:
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