2014-09-21 87 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