2011-01-25 16 views
6

una consulta SQL bastante complicada que podría estar haciendo mucho más difícil de lo que debería ser: Tengo dos tablas:MySql full join (unión) y ordenar en múltiples columnas de fecha

Noticias: newsid, fecha y hora, newstext

foto: pictureid, fecha y hora, imgPath

los dos no están relacionados, lo único que he incorporado en la fecha que la noticia/se ha creado en

SQL hasta ahora:

SELECT * FROM news as n LEFT OUTER JOIN (SELECT count(pictureid), datetime 
FROM picture GROUP BY DATE(datetime)) as p ON DATE(n.datetime) = DATE(p.datetime) 
UNION 
SELECT * FROM news as n RIGHT OUTER JOIN (SELECT count(pictureid), 
datetime FROM picture GROUP BY DATE(datetime)) as p ON 
DATE(n.datetime) = DATE(p.datetime) 

Tengo que usar la unión para simular una combinación externa completa en MySQL. Los resultados:

newsid  text  datetime count() datetime 
1  sometext 2011-01-16 1  2011-01-16 
2   moo2 2011-01-19 NULL  NULL 
3  mooo3 2011-01-19 NULL  NULL 
NULL  NULL  NULL  4   2011-01-14 

El problema es que, obviamente, termino con dos fechas uno columnas- de noticias y una de las imágenes, esto significa que no puede ordenar por fecha y tiene que ser en el orden correcto! ¿Algunas ideas? ¡Incluso si eso significa reestructurar la base de datos! Necesito que la fecha esté en una sola columna.

La respuesta vino de Serpro El código de trabajo completo es:

SELECT `newsid`, `text`, 
    CASE 
    WHEN `datetime` IS NULL 
    THEN `pdate` 
    ELSE `datetime` 
    END 
    as `datetime`, 

`pcount` FROM 
(
    (SELECT * FROM news as n LEFT OUTER JOIN 
     (SELECT count(pictureid) as pcount, datetime as pdate FROM picture GROUP BY DATE(datetime)) as p 
     ON DATE(n.datetime) = DATE(p.pdate) ORDER BY datetime 
    ) 
    UNION 
    (SELECT * FROM news as n RIGHT OUTER JOIN 
     (SELECT count(pictureid) as pcount, datetime as pdate FROM picture GROUP BY DATE(datetime)) as p 
     ON DATE(n.datetime) = DATE(p.pdate) ORDER BY datetime 
    ) 

) as x 
ORDER BY datetime 

Respuesta

3

solo usando su estructura de base de datos y su consulta, y dado que FULL OUTER JOIN no está disponible en MySQL, creo que una solución podría ser esta:

SELECT 
    `newsid`, 
    `text`, 
    CASE 
     WHEN `datetime` IS NULL THEN `pdate` 
     ELSE `datetime` 
    END as `datetime, 
    `pcount` 
(
SELECT * 
FROM `news` as `n` 
    LEFT OUTER JOIN (
         SELECT count(pictureid) as `pcount`, datetime as `pdate` 
         FROM picture GROUP BY DATE(datetime) 
        ) as p ON DATE(n.datetime) = DATE(p.datetime) 
    UNION 
SELECT * 
    FROM `news` as `n` 
    RIGHT OUTER JOIN (
         SELECT count(pictureid) as `pcount`, datetime as `pdate` 
         FROM picture GROUP BY DATE(datetime) 
        ) as p ON DATE(n.datetime) = DATE(p.datetime) 

) 
+1

¡Absolutamente increíble! ¡Gracias! Agregué el código de trabajo a mi publicación principal – Charli

+0

De nada :) – SERPRO

0

Creo que su código sería resuelto a este fin y podría explicar la fecha y hora especie parte un poco más en detalle

SELECT * 
FROM News FULL OUTER JOIN Picture 
ON News.Datetime = Picture.Datetime ORDER BY DateTime Asc 
+0

Si, eso es lo que se resuelve! Simplemente MySQL no parece ser capaz de hacer FULL OUTER JOINs, por lo que la UNION y la replicación son una alternativa. Necesito que las fechas estén todas en una columna para poder ordenarlas correctamente, con dos columnas (una de cada imagen y noticias) y las lagunas son nulas. La consulta termina enumerando todas las noticias, luego todas las imágenes. ¿Es eso más claro? – Charli

+0

¿Qué representa el datetime en News y el datetime in Picture? ¿Fechas de carga? Si son diferentes, puede que tenga que concatenar ex:

select columnA||columnB from TABLEA; (Concats column A and B)
Deeptechtons

+0

Sí, solo están cargando fechas – Charli

0

Siempre se puede envolver la consulta con otro:

SELECT ..., IF(datetime1 IS NULL, datetime2, datetime1) as datetime, ... FROM 
(
    ... your query ... 
) 
ORDER BY datetime 
+0

Esto es lo que terminé haciendo, ¡no había pensado en eso! ¡Gracias! – Charli

Cuestiones relacionadas