根据其他表的值排序MySQL查询ASC或DESC
问题描述:
我得到了一个查询,并且我想根据另一个数据库对结果进行麦汁排序。根据其他表的值排序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
答
请问像这样的工作?
ORDER BY CASE WHEN b.`order` = 'ASC' b.`sort` ELSE -b.`sort` END;
如果不是,请提供一些示例数据和该数据的预期结果,以便我们更好地理解您的要求。
答
你不能在一个查询中做到这一点。
给定的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
我改变了我的问题,希望问题变得更加清晰。 – Deen
可以请您添加预期的结果。 – JeffUK