2011-07-22 24 views
15

I no quiere cualquier tipo de JOIN aquí. Estoy construyendo 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.Seleccionar filas separadas de dos tablas, ordenar por fecha

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 mesa 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 

Quiero seleccionar todos los datos de ambas tablas ordenadas por la columna común created, por lo un ejemplo de resultado 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 table no es necesaria; Lo agregué para hacer las cosas un poco más fáciles de entender.

Espero que sea obvio lo que quiero hacer; en lugar de hacer un JOIN donde se genera una fila a partir de columnas de dos tablas, quiero obtener todos los datos de fila con un diseño de columna común donde cualquier columna que no exista en una tabla tenga NULL puesto en ella.

Háganme saber si necesita alguna aclaración.

+0

'UNIÓN all' suena como lo que necesita (con columnas ficticias para dar cuenta de las diferencias estructurales) –

Respuesta

22

El uso de columnas ficticias para dar cuenta de las diferentes estructuras, una unión que se unen a ellos y uno de los padres de selección para manejar el orden:

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 
+0

Muchas gracias Brendan - esto funciona un convite. – Bojangles

13

Ampliando la sugerencia de @Brendan Bullen, he aquí un ejemplo usando 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 
+0

¡Llegué antes que yo con la consulta real! :) Algo que siempre me confunde con la unión, ¿eso 'ORDER BY' se aplica a los resultados como un todo o solo a la segunda declaración select? Es decir, como en mi respuesta, ¿tiene sentido separarlo? –

+0

@Brendan, el 'ORDER BY 'se aplica al resultado de UNION, por lo que no es necesario utilizar una sub-selección. –

+0

Además, tuve algunos errores tipográficos en mi consulta original. Los arreglé ahora. –

Cuestiones relacionadas