web-dev-qa-db-ja.com

"UNION"(Mysql)に "ORDER BY"を適用する

良い一日。だから、everythignはタイトルにあります:)

私は2つの要求の結果をマージし、結果を一緒に並べようとしています(次々とではありません)。 =>ユニオンを適用して注文することを考えていました。うまくいきませんでした。

私はここ on Stack またはここ developpez(!!フランスのウェブサイト) のように見回しました。私は別の例と提案を試みますが、成功しません。 Mysqlで作業しているため、私が赤であるように思われます。

とにかく、ここに私の試みと結果があります:

私の元の2つのリクエスト

SELECT * FROM user_relation WHERE from_user_id = 1
List item
SELECT * FROM user_relation WHERE to_user_id = 1

このリストの結果は、最初の選択(インデックスキーで順序付け)の結果と、それに続くインデックスKEyで順序付けされた2番目の選択の結果で構成されています。

試み1:

(SELECT * FROM user_relation WHERE from_user_id = 1 ORDER BY trust_degree)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1 ORDER BY trust_degree)

リクエストは実行されましたが、結果は元のリクエストと同じでした:最初の選択の結果(インデックスキーで並べ替え)に続いて2番目のリクエストの結果

試み2:

(SELECT * FROM user_relation WHERE from_user_id = 1 ORDER BY trust_degree)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1 ORDER BY trust_degree)
ORDER BY trust_degree

=>リクエストが実行され、結果は試行1でしたが、MySQLロジックで警告が表示されました:(このタイプのクローズはすでに分析されています(ORDER BY))

試行3

(SELECT * FROM user_relation WHERE from_user_id = 1
UNION
SELECT * FROM user_relation WHERE to_user_id = 1)
ORDER BY trust_degree

=>実行されませんが、エラー#1064-UNION付近の構文エラー

試行4:

SELECT *
FROM (
(SELECT * FROM user_relation WHERE from_user_id = 1)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1)
)
ORDER BY trust_degree 

=>実行せず、6エラーのニースリスト。なにか提案を?

12
Quiche
SELECT *
FROM (
(SELECT * FROM user_relation WHERE from_user_id = 1)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1)
) AS i
ORDER BY trust_degree

選択にエイリアスを割り当てる必要があります。ただし、この場合、UNIONは不要であり、@ Karoly Horvathがコメントで指摘しているように、単純なORで置き換えることができます。結果のクエリは次のようになります。

SELECT 
 * 
FROM user_relation 
WHERE from_user_id = 1 OR to_user_id = 1 
ORDER BY trust_degree
11
Michael Kunst

UNIONのドキュメント で記述されています。

ORDER BYまたはLIMITを個々のSELECTに適用するには、SELECTを囲む括弧内に句を配置します。

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

...

個々のSELECTステートメントでORDER BYを使用しても、UNIONはデフォルトで順序付けられていない行のセットを生成するため、最終結果に行が表示される順序については何も意味しません。

...

ORDER BYまたはLIMIT句を使用してUNION結果全体をソートまたは制限するには、個々のSELECTステートメントを括弧で囲み、最後のステートメントの後にORDER BYまたはLIMITを配置します。次の例では、両方の句を使用しています。

(SELECT a FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;

括弧なしのステートメントは、上記のように括弧で囲まれたものと同等です。

上記の情報をクエリに適用すると、次のようになります。

(SELECT * FROM user_relation WHERE from_user_id = 1)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1)
ORDER BY trust_degree
5
axiac