Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个联接表对MySQL查询进行排序_Mysql_Sql - Fatal编程技术网

使用多个联接表对MySQL查询进行排序

使用多个联接表对MySQL查询进行排序,mysql,sql,Mysql,Sql,我的查询使用左连接从表对象\u值中获取多个值。我无法按照我想要的方式对结果进行排序;如果为ASC,则首先显示属性值最低的对象;如果为DESC,则首先显示属性值最高的对象 实际上,当顺序方向为DESC时,我已经设法使其工作,但当方向为ASC时,结果只会进入结果的底部,而不管属性ID如何 将237个结果放在底部的查询如下: SELECT objects.id, objects.title, values.value FROM objects LEFT JOIN objects

我的查询使用左连接从表对象\u值中获取多个值。我无法按照我想要的方式对结果进行排序;如果为ASC,则首先显示属性值最低的对象;如果为DESC,则首先显示属性值最高的对象

实际上,当顺序方向为DESC时,我已经设法使其工作,但当方向为ASC时,结果只会进入结果的底部,而不管属性ID如何

将237个结果放在底部的查询如下:

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

这是一个如此简单的解决方案,但我自己却无法解决:)谢谢!非常感谢你!