2017-07-25 90 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