簡體   English   中英

MySql完全連接(聯合)和多個日期列的排序

[英]MySql full join (union) and ordering on multiple date columns

一個相當復雜的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) 

我必須使用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 

問題是我顯然最終得到了兩個日期列 - 一個來自新聞,另一個來自圖片,這意味着我無法按日期排序並且按正確順序排列! 有任何想法嗎? 即使這意味着重組數據庫! 我需要將日期放在一個列中。

答案來自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

只是使用你的數據庫結構和你的查詢,因為在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) 

)

我認為你的代碼最終會解決這個問題,你能否詳細解釋日期時間排序部分

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

您始終可以使用另一個查詢包裝查詢:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM