【问题标题】:Sort MySQL query with multiple joined tables使用多个连接表对 MySQL 查询进行排序
【发布时间】:2021-02-11 20:11:05
【问题描述】:

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

当订单方向是 DESC 时,我实际上已经设法让它工作,但是当方向是 ASC 时,无论attributeId 是什么,它们都会转到结果的底部。

将 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_values 表的 20 个不同属性。

我是不是走错路了?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    要将237放在首位,可以使用:

    ORDER BY (values.attributeId = 237) DESC
             objects.id asc
    

    这使用了 MySQL 的特性,布尔表达式在数字上下文中被视为数字,“1”代表真,“0”代表假(这就是为什么需要 DESC 才能成为第一个)。

    这相当于:

    ORDER BY (CASE WHEN values.attributeId = 237 THEN 1 ELSE 0 END) DESC
             objects.id asc
    

    【讨论】:

    • 这是一个如此简单的解决方案,但我自己却无法弄清楚:) 谢谢!
    【解决方案2】:

    使用 case 表达式将 237 放在首位:

    ORDER BY CASE WHEN values.attributeId = 237 THEN 0 ELSE 1 END asc,
             values.value asc, objects.id asc
    

    ANSI SQL 兼容,即可移植!

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 1970-01-01
      • 2018-11-06
      • 2021-09-26
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2020-04-23
      相关资源
      最近更新 更多