2014-09-21 23 views
2

每個表(table1 & table2)都有自己的DATETIME字段。
我試圖捕捉兩個表的id,並按他們的DATETIME字段排序。MySQL聯合查詢,按2個變量排序

實施例:

Table 1      Table 2 
------------     ------------- 
id | datetime1    id | table1id | datetime2 
------------------------  ----------------------- 
1 | 2014-09-21 20:31:26  1 | 2   | 2014-09-21 20:31:29 
2 | 2014-09-21 20:31:27  2 | 3   | 2014-09-21 20:31:30 
3 | 2014-09-21 20:31:28 

Table 3      
------------    
id | user    
------------------------ 
2 | phil     
3 | nathalie 

我的輸出不與此查詢正確排序:

SELECT * 
FROM (
    SELECT 
    1 AS selection, 
    table1.id, table1.datetime1, 
    table2.datetime2 
    table3.user 
    FROM Table1 
    LEFT OUTER JOIN table2 
    ON table1.id = table2.table1id 
    LEFT OUTER JOIN table3 
    ON table1.id = table3.id 

    UNION ALL 

    SELECT 
    2 AS selection, 
    table1.id, table1.datetime1, 
    table2.datetime2 
    table3.user 
    FROM Table1 
    INNER JOIN table2 
    ON table1.id = table2.table1id 
    INNER JOIN table3 
    ON table1.id = table3.id 
) AS query 
ORDER BY table1.datetime1 DESC, table2.datetime2 DESC 

期望的數據:
從表2 ID:2,1,
從表1 id:3,2,1
So:2,1,3,2,1

////編輯

對於那些可能需要長時間和複雜的MySQL請求而苦惱的人,請在PhpmyAdmin嘗試!它會告訴你錯誤!

////編輯

+0

爲什麼你有一個笛卡爾積呢?是故意的嗎? – zerkms 2014-09-21 23:58:30

+0

問題已被編輯。 – gr3g 2014-09-22 00:29:36

+0

請根據您的樣品數據提供所需的結果。 – 2014-09-22 01:15:45

回答

3

你真正需要做的是更仔細考慮您的架構。考慮命名的日期時間列相同,然後運行一個查詢這樣的 - http://sqlfiddle.com/#!2/a3b4c/7/0

SELECT selection, id, datetimefoo, user FROM (
    SELECT 
    1 AS selection, 
    table1.id, table1.datetimefoo, 
    table3.user 
    FROM table1 
    LEFT OUTER JOIN table2 
    ON table1.id = table2.table1id 
    LEFT OUTER JOIN table3 
    ON table1.id = table3.id 


    UNION 

    SELECT 
    2 AS selection, 
    table1.id, table1.datetimefoo, 
    table3.user 
    FROM table1 
    INNER JOIN table2 
    ON table1.id = table2.table1id 
    INNER JOIN table3 
    ON table1.id = table3.id 

) AS T2 
ORDER BY datetimefoo DESC 

在SQL撥弄這將產生的結果更接近你在找什麼。我仍然不確定你爲什麼需要第二個查詢中的INNER JOINS,但是這裏沒有你在做的事情。

這裏是不需要的列名的變化的另一種方法,但需要排序的列一個別名 - http://sqlfiddle.com/#!2/ec4bc/3/0

SELECT * FROM (
    SELECT 
    1 AS selection, 
    table1.id, table1.datetimefoo AS sort_date, -- alias on first table's date 
    table2.datetimebar, 
    table3.user 
    FROM table1 
    LEFT OUTER JOIN table2 
    ON table1.id = table2.table1id 
    LEFT OUTER JOIN table3 
    ON table1.id = table3.id 


    UNION 

    SELECT 
    2 AS selection, 
    table1.id, table1.datetimefoo, 
    table2.datetimebar AS sort_date, -- alias on second table's date 
    table3.user 
    FROM table1 
    INNER JOIN table2 
    ON table1.id = table2.table1id 
    INNER JOIN table3 
    ON table1.id = table3.id 

) AS T2 
ORDER BY sort_date DESC 
+0

來自[docs](http://dev.mysql.com/doc/refman/5.7/en/union.html),我強調:「對單個SELECT語句使用ORDER BY意味着沒有任何關於行會出現在最終結果中,因爲默認情況下,UNION會生成一個**無序的**行集......如果ORDER BY在SELECT中沒有LIMIT出現,它會被優化掉,因爲**無論如何都不會有效果。 「 – 2014-09-22 17:39:54

+0

True @ PM77-1,但它的工作往往不是。我已經更新了我的答案,以獲得更強大的解決方案。 – 2014-09-22 18:33:50

2

我相信你是過於複雜一個相當簡單的任務:

SELECT * 
FROM (
    SELECT 1 AS selection, table1.id as id, table1.datetime1 as date FROM Table1 
    UNION ALL 
    SELECT 2 AS selection, table2.id as id, table2.datetime2 as date FROM Table2 
) AS query 
ORDER BY date DESC 
+0

我需要使用此INNER JOIN,因爲我需要獲取其他數據... – gr3g 2014-09-22 00:06:41

+0

@ user1824508:那麼您需要更準確地使用它。您至少需要指定加入條件 – zerkms 2014-09-22 00:07:29

+1

什麼*其他數據*?如果您有其他要求,請將其添加到您的帖子中。正如現在所顯示的,你沒有任何東西可以形成連接條件。 – 2014-09-22 00:09:35