2017-10-19 12 views
2

私の質問があるUNIONで作業されていません。ORDERは、次のようにALL

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

timeカラムが両方のテーブルに存在しているが、MySQLは、次のエラースロー:私は削除

unknown column 'time' in 'order clause'

, 'dossier' as Source, 'contract' as Sourceクエリが正しく機能します。

+1

お願いします2つのテーブルのスキーマとして – apomene

答えて

1

order by句はtime列(のみtitleSource)を持っていない、ここunion all全体の選択に適用されます。あなたができることは、一時テーブルを使用することです:

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はこれを解決する1つの方法があります。

order byselect句の一部ではありません。選択されている列のみがわかります。

もう1つの解決策は簡単です。 。 。結果セットには単にtimeが含まれています。

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

私はテーブルが大きく、彼らはtimeのインデックスを持っている場合は、次のは、より効率的であってもよいことに留意すべきである:何が起こっていることは、あなたが括弧を使用する場合は明確であるかもしれない

(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;