Лучший способ - создать новую таблицу, содержащую общие поля из трех других таблиц, и добавить индекс в поле общей даты. Исходные три таблицы должны содержать внешний ключ, связанный с общей таблицей. С этим дизайном запрос становится простым:
SELECT *
FROM common_table
ORDER BY "date" DESC
LIMIT 100
Если вам также нужны данные из более конкретных таблиц, вы можете использовать ЛЕВЫЕ СОЕДИНЕНИЯ, чтобы также выбрать эти данные в том же запросе.
Если вы не можете изменить свой дизайн и производительность не является проблемой, вы можете использовать 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