使用多个联接表对MySQL查询进行排序
我的查询使用左连接从表对象\u值中获取多个值。我无法按照我想要的方式对结果进行排序;如果为ASC,则首先显示属性值最低的对象;如果为DESC,则首先显示属性值最高的对象 实际上,当顺序方向为DESC时,我已经设法使其工作,但当方向为ASC时,结果只会进入结果的底部,而不管属性ID如何 将237个结果放在底部的查询如下:使用多个联接表对MySQL查询进行排序,mysql,sql,Mysql,Sql,我的查询使用左连接从表对象\u值中获取多个值。我无法按照我想要的方式对结果进行排序;如果为ASC,则首先显示属性值最低的对象;如果为DESC,则首先显示属性值最高的对象 实际上,当顺序方向为DESC时,我已经设法使其工作,但当方向为ASC时,结果只会进入结果的底部,而不管属性ID如何 将237个结果放在底部的查询如下: SELECT objects.id, objects.title, values.value FROM objects LEFT JOIN objects
SELECT
objects.id,
objects.title,
values.value
FROM objects
LEFT JOIN objects_values AS values ON values.objectId=objects.id
WHERE objects.categoryId IN (195)
ORDER BY
CASE WHEN values.attributeId=237 THEN values.value END ASC,
objects.id asc
我希望查询总是先按属性237排序,然后将这些结果放在结果中的第一位,不管237的值是0.1还是10
如果所有联接的表都有唯一的名称,那么这将很容易,但是这个查询可以从objects\u values表中提取20个不同的属性
我是否以错误的方式处理此问题?使用
case
表达式将237放在第一位:
ORDER BY CASE WHEN values.attributeId = 237 THEN 0 ELSE 1 END asc,
values.value asc, objects.id asc
符合ANSI SQL标准,即可移植 要首先放置
237
,您可以使用:
ORDER BY (values.attributeId = 237) DESC
objects.id asc
这使用了MySQL的特性,即布尔表达式在数字上下文中被视为数字,其中“1”表示true,“0”表示false(这就是为什么首先需要DESC
)
这相当于:
ORDER BY (CASE WHEN values.attributeId = 237 THEN 1 ELSE 0 END) DESC
objects.id asc
这是一个如此简单的解决方案,但我自己却无法解决:)谢谢!非常感谢你!