mysql - unir - Seleccione filas separadas de dos tablas, ordenadas por fecha
select de dos tablas mysql (2)
No quiero ningún tipo de JOIN
aquí. Estoy creando una fuente RSS de dos tablas usando PHP, y quiero seleccionar todas las filas de las dos tablas, manteniendo las filas separadas pero ordenando por una columna created
común.
Por ejemplo, si tengo una tabla 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
Y una bar
mesa:
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
Quiero seleccionar todos los datos de ambas tablas ordenadas por la columna created
comúnmente, por lo que un conjunto de resultados de ejemplo sería ( ignorando bar.id
ya que no es necesario ):
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
La columna de la table
no es necesaria; Lo agregué para hacer las cosas un poco más fáciles de entender.
Ojalá sea obvio lo que quiero hacer; en lugar de hacer una JOIN
donde se genera una fila a partir de columnas de dos tablas, quiero obtener todos los datos de las filas con un diseño de columna común donde cualquier columna que no exista en una tabla tiene NULL
.
Por favor, hágamelo saber si necesita una aclaración.
Ampliando la sugerencia de @Brendan Bullen, aquí hay un ejemplo que usa UNION ALL
que debería funcionar para usted:
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
Usando columnas ficticias para tener en cuenta las diferentes estructuras, una unión para unirlas y una selección primaria para manejar el ordenamiento:
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