Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Vereinigungsabfrage, Reihenfolge nach 2 Variablen

Was Sie wirklich tun müssen, ist, Ihr Schema sorgfältiger zu betrachten. Erwägen Sie, die Datumszeitspalten gleich zu benennen und dann eine Abfrage wie diese auszuführen - 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

In der SQL-Fiddle führt dies zu Ergebnissen, die näher an dem liegen, wonach Sie suchen. Ich bin mir immer noch nicht sicher, warum Sie die INNER JOINS bei der zweiten Abfrage benötigen - es gibt nichts, was Sie hier tun, was sie erfordert.

Hier ist eine andere Methode, die keine Änderung der Spaltennamen erfordert, aber einen Alias ​​für die sortierbaren Spalten erfordert - 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