2014-09-21 3 views
2

각 테이블 (테이블 1 & 테이블 2)에는 고유 한 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 

원하는 데이터 : 표 1에서 2, 1,
: 표 2 ID와
id : 3, 2, 1
그래서 : 2, 1, 3, 2, 1

/// EDIT

길고 복잡한 MySQL 요청으로 어려움을 겪고있는 사람들에게 PhpmyAdmin!에서 시도해보십시오! 그것은 당신에게 오류를 알려줍니다!

//// 편집

+0

를? 의도적인가? – zerkms

+0

질문이 수정되었습니다. – gr3g

+0

샘플 데이터를 기반으로 원하는 결과를 제공하십시오. –

답변

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은 ** 정렬되지 않은 ** 행 집합을 생성하기 때문에 행이 최종 결과에 나타납니다 ... SELECT에 LIMIT없이 ORDER BY가 표시되면 ** 아무튼 ** 효과가 없으므로 최적화되지 않습니다. " –

+0

True @ PM77-1이지만 더 자주 작동합니다. 훨씬 더 강력한 솔루션으로 내 대답을 업데이트했습니다. –

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

+0

@ user1824508 : 그러면 더 정확하게 입력해야합니다. 적어도 조인 조건을 지정해야합니다 – zerkms

+1

* * 다른 데이터 *? 추가 요구 사항이있는 경우 게시물에 추가하십시오. 이제 표시되었으므로 조인 조건을 구성 할 항목이 없습니다. –