Выбрать отдельные строки из двух таблиц, упорядочить по дате
Я не хочу никого типа JOIN
здесь. Я строю RSS-канал из двух таблиц с помощью PHP, и я хочу выбрать все строки из двух таблиц, сохраняя отдельные строки, но сортируя по общему столбцу created
.
Например, если у меня есть таблица foo
:
id downloads views created
-----------------------------------------------
1 12 23 2011-07-22 00:10:16
2 51 900 2011-07-22 10:11:45
3 8 80 2011-07-23 04:12:18
И таблица bar
:
id title body created
-----------------------------------------------
1 foo ogblog 2011-07-21 10:54:07
3 bar zip 2011-07-24 10:54:07
4 zip bar 2011-07-25 10:54:07
Я хочу выбрать все данные из обеих таблиц, упорядоченных по общему столбцу created
, поэтому примерный набор результатов будет (игнорировать bar.id
, поскольку он не нужен):
id title body downloads views created | table
-------------------------------------------------------------------------------
NULL bar zip NULL NULL 2011-07-24 10:54:07 | bar
NULL foo ogblog NULL NULL 2011-07-21 10:54:07 | bar
1 NULL NULL 12 23 2011-07-22 00:10:16 | foo
2 NULL NULL 51 900 2011-07-22 10:11:45 | foo
3 NULL NULL 8 80 2011-07-23 04:12:18 | foo
NULL zip bar NULL NULL 2011-07-25 10:54:07 | bar
Столбец table
не нужен; Я добавил его, чтобы сделать вещи немного легче понять.
Надеюсь, это очевидно, что я хочу делать; вместо того, чтобы делать JOIN
, где строка создается из столбцов из двух таблиц, я хочу получить все данные строки с общим расположением столбцов, где любой столбец, который не существует в таблице, помещен в него.
Пожалуйста, дайте мне знать, если вам нужно уточнение.
Ответы
Ответ 1
Использование фиктивных столбцов для учета разных структур, объединение для их объединения и родительский выбор для обработки заказа:
SELECT * FROM (
(SELECT foo.id, NULL AS title, NULL AS body, foo.downloads, foo.views, foo.created FROM foo)
UNION ALL
(SELECT NULL AS id, bar.title, bar.body, NULL AS downloads, NULL AS views, bar.created FROM bar)
) results
ORDER BY created ASC
Ответ 2
Расширяя предложение @Brendan Bullen, вот пример использования UNION ALL
, который должен сработать для вас:
SELECT id as id, NULL as title, NULL as body, downloads as downloads,
views as views, created as created, 'foo' as table_name
FROM foo
UNION ALL
SELECT NULL as id, title as title, body as body, NULL as downloads,
NULL as views, created as created, 'bar' as table_name
FROM bar
ORDER BY created ASC