2017-05-02 69 views
1

美好的一天。 因此,everythign是在標題:)在「UNION」(Mysql)上應用「ORDER BY」

我期待合併兩個請求的結果並將結果排序在一起(如在不一個接一個)。 =>我正在考慮申請工會並訂購。 它沒有奏效。

我環顧這裏on Stack或這裏developpez (!!french website)。我嘗試了不同的例子和建議,但沒有成功。 從我的紅色看來,這是因爲我正在使用Mysql。

總之,這裏是我的attemps,並將結果:

我原來的2個請求

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

由德弗里斯特的結果列表的這一結果選擇(通過索引鍵odered),其次由Index KEy排序的第二個選擇的結果。

嘗試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) 

請求跑,但TEH結果是格蘭相同原單請求:第一選擇(由索引鍵順序)的結果,然後通過所述第二請求的結果

嘗試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,但具有警告i中的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錯誤列表。 有什麼建議嗎?

+3

怎麼樣一個簡單的'或'? :) –

+0

你試過選擇你的聯合結果INTO臨時表,然後從那裏選擇和ORDER BY? – nageeb

+0

我很金髮...... thx !! :D – Quiche

回答

0
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不是必要的,可以用簡單的OR來代替,正如@Karoly Horvath在他的評論中指出的那樣。生成的查詢應該是這樣的:

SELECT 
* 
FROM user_relation 
WHERE from_user_id = 1 OR to_user_id = 1 
ORDER BY trust_degree 
+0

謝謝,它的工作。我確實錯過了「AS」(仍在學習:)) 和...不,或不這樣做。 (我曾嘗試過,即使我正在學習;)))如果用戶在關係的兩邊都存在,他會被計數兩次。 工會允許我避免操縱結果,一旦我得到它們。 – Quiche

+0

你能告訴我你想要做什麼嗎?你之後選擇的數據會發生什麼? –

+0

那麼,當時我最初的想法是不做一個OR,所以我做的袖子的ID沒有出現在我的結果中,以便於以後緩解我的PHP。 但是,一旦我得到上述解決方案並應用它,我不得不離開它。因爲我不能解釋我自己,一旦閱讀答案o兩個選擇合併在一起......它實際上合併了兩列的結果(to_user_id)...甚至是來自「from_user_id」的結果。所以...不知道f列的變化是如何基於的。我通過強制右列中的一個行對的較小的id來修復它。像(1 | 2)(3 | 9)使用或! – Quiche

0

這是寫在documentation of UNION

申請ORDER BYLIMIT到個人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 BYLIMIT條款進行排序或限制整個UNION結果,圓括號個人SELECT語句並把ORDER BYLIMIT最後一個之後。下面的示例使用兩個子句:如剛纔所示

(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 
+0

你也得到了我的代幣...嘗試所有的組合,我錯過了這一個,我確信我嘗試了(我很確定,我只是看了一下我的帖子,因爲我一定會使用這個解決方案。 – Quiche

-1

爲了擴大對我的評論:

SELECT * into #tempTable FROM (
    SELECT * FROM user_relation WHERE from_user_id = 1 
    UNION 
    SELECT * FROM user_relation WHERE to_user_id = 1 
) 
as x 

SELECT * FROM #tempTable ORDER BY trust_degree 
DROP TABLE #temptable