2017-07-25 94 views
0

我得到了一個查詢,並且我想根據另一個數據庫對結果進行麥汁排序。根據其他表的值排序MySQL查詢ASC或DESC

這是我的查詢:

SELECT a.`name` 
FROM  `article` AS a 
LEFT JOIN `container` AS b 
     ON b.`id` = a.`container` 
WHERE  a.`container` = '1' 
ORDER BY b.`sort` ASC; 

這工作得很好,但它總是排序結果上升。弼我想ist根據容器表中的值進行排序。

Article table 

id | container | name | gender 
---|---------------------|--------- 
1 | 1   | Michael | male 
2 | 1   | Joe  | male 
3 | 2   | Karen | female 
4 | 2   | Andrew | male 
5 | 3   | Jessica | female 


Container table 

id | sort | order 
---|--------|---- 
1 | name | asc 
2 | name | desc 
3 | gender | asc 
4 | name | asc 
5 | gender | desc 

如何更改我的查詢以從容器表中獲取訂單?

我希望這樣的結果:

id | container | name | gender 
---|---------------------|--------- 
2 | 1   | Joe  | male 
1 | 1   | Michael | male 

回答

0

請問像這樣的工作?

ORDER BY CASE WHEN b.`order` = 'ASC' b.`sort` ELSE -b.`sort` END; 

如果不是,請提供一些示例數據和該數據的預期結果,以便我們更好地理解您的要求。

+0

我改變了我的問題,希望問題變得更加清晰。 – Deen

+0

可以請您添加預期的結果。 – JeffUK

1

你不能在一個查詢中做到這一點。

給定的SQL查詢必須在準備查詢時進行修復,這是在執行開始之前。您不能根據執行時發現的數據來改變行爲。

您必須在一個查詢中讀取排序方向,然後使用您發現的值格式化動態SQL查詢。

SELECT `sort`, `order` FROM container WHERE id = 1 

取這些數據轉換成應用程序變量像$sort_column$direction。然後使用它們:

$sql = " 
    SELECT a.`name` 
    FROM  `article` AS a 
    WHERE  a.`container` = '1' 
    ORDER BY {$sort_column} {$direction}"; 

...prepare $sql as a query... 

...execute query... 

(我假設的變量PHP語法,但你可以做任何語言類似的東西。)

+0

同意。我已經通過使用一組嵌套的'case'語句動態地反轉數字值並對其進行排序來顯示數字列的可能性;隨着列數的增加,這將非常迅速地變得笨重。但是對於字符串來說,這將是一個巨大的混亂,涉及到找到ascii值並將它們混合在一起。這種動態需求是過程語言理想的地方。 – JeffUK