2017-10-19 6 views
2

Ma question est la suivante:clause ORDER BY ne fonctionne pas avec UNION ALL

SELECT title, 'dossier' as Source FROM dossier 
UNION ALL 
SELECT title, 'contract' as Source FROM contract ORDER BY `time` LIMIT 5 

time colonne est présente dans les deux tableaux, mais MySQL jette l'erreur suivante:

unknown column 'time' in 'order clause'

Lorsque je retire , 'dossier' as Source et , 'contract' as Source la requête fonctionne correctement.

+1

s'il vous plaît donner comme le schéma de deux tables – apomene

Répondre

1

order by clause est appliquée sur la union all sélection d'ensemble ici, qui n'a pas la colonne time (seulement title et Source). Ce que vous pouvez faire est d'utiliser une table temporaire:

select `title`, `source` from (
    select `title`, 'dossier' as `Source`, `time` from dossier 
    union all 
    select `title`, 'contract', `time` from contract 
) tbl 
order by `time` 
limit 5 
1

@Potashin a une méthode pour résoudre ce.

Vous devez comprendre que le order by ne fait partie d'aucune des clauses select. Il ne connaît que les colonnes sélectionnées.

Une autre solution est assez facile. . . Cela consiste à inclure simplement time dans le jeu de résultats. Ce qui se passe peut-être plus clair si vous utilisez entre parenthèses:

(SELECT title, 'dossier', time as Source 
FROM dossier 
) 
UNION ALL 
(SELECT title, 'contract', time as Source 
FROM contract 
) 
ORDER BY `time` 
LIMIT 5; 

Je note que si les tables sont grandes et ils ont des indices sur time, alors ce qui suit peut être plus efficace:

(SELECT title, 'dossier', time as Source 
FROM dossier 
ORDER BY `time` 
LIMIT 5 
) 
UNION ALL 
(SELECT title, 'contract', time as Source 
FROM contract 
ORDER BY `time` 
LIMIT 5 
) 
ORDER BY `time` 
LIMIT 5;