MySql完全连接(联合)和多个日期列的排序

Cha*_*rli 6 mysql

一个相当复杂的SQL查询我可能会变得更加困难:我有两个表:

新闻:newsid,datetime,newstext

图片:pictureid,datetime,imgPath

这两者没有关系,我只是在创建新闻/图片的日期加入

SQL到目前为止:

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) 
Run Code Online (Sandbox Code Playgroud)

我必须使用union来模拟MySQL中的完整外连接.结果:

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 
Run Code Online (Sandbox Code Playgroud)

问题是我显然最终得到了两个日期列 - 一个来自新闻,另一个来自图片,这意味着我无法按日期排序并且按正确顺序排列!有任何想法吗?即使这意味着重组数据库!我需要将日期放在一个列中.

答案来自SeRPRo完成的工作代码是:

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
Run Code Online (Sandbox Code Playgroud)

SER*_*PRO 3

只需使用您的数据库结构和查询,并且由于 MySQL 中不提供 FULL OUTER JOIN,我认为解决方案可能是这样的:

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) 

)
Run Code Online (Sandbox Code Playgroud)