Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête d'union MySQL, triée par 2 variables

Ce que vous devez vraiment faire, c'est examiner votre schéma plus attentivement. Envisagez de nommer les colonnes de date et d'heure de la même manière, puis d'exécuter une requête comme celle-ci - 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

Dans le violon SQL, cela produit des résultats plus proches de ce que vous recherchez. Je ne sais toujours pas pourquoi vous avez besoin des INNER JOINS sur la deuxième requête - il n'y a rien que vous fassiez ici qui les nécessite.

Voici une autre méthode qui ne nécessite pas de changement des noms de colonne, mais nécessite un alias pour les colonnes triables - 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