代码之家  ›  专栏  ›  技术社区  ›  xendi

按顺序替换条件子查询(性能考虑)

  •  0
  • xendi  · 技术社区  · 4 年前

    我有一个评分表(t2),我用它来排序查询 lower_bound DESC lower_bound 必须是 null 0 . 当发生评级时,行将使用Wilson的评级算法进行更新。这意味着新条目在 下限描述 排序,即使它们还没有评级(null或0小于say,0.2小于Wilson的评级算法)。

    IF 语句和子查询,用于选择具有最大 下限 下限 最后点的。它可以工作,但出于性能原因,我希望尽可能避免此类查询。

    这个能吗 ORDER BY 是以更有效的方式完成的,大概没有子查询?

    SELECT
        t1.*, t2.stars as rating
    FROM
        table1 t1
    JOIN
        table2 t2
        ON
            t2.user_id = t1.id
    WHERE
        NOT t1.is_ready
    ORDER BY
        IF(t2.lower_bound = NULL, (select lower_bound from t2 order by lower_bound asc)+1, t2.lower_bound)
            DESC
    
    1 回复  |  直到 4 年前
        1
  •  0
  •   Nick    4 年前

    我想你可以写你的 ORDER BY 从句效率更高,首先按 t2.lower_bound IS NULL 然后根据实际值,即。

    ORDER BY t2.lower_bound IS NULL, t2.lower_bound DESC
    

    这将确保所有带有 NULL lower_bound 值最后排序,因为 t2.下限为空 对他们来说是1而对非- 无效的 价值观。

        2
  •  0
  •   Beach Chicken    4 年前

    (CASE WHEN t2.lower_bound IS NULL THEN 0 ELSE 1 END) AS order_column

    然后添加 order_column

    ORDER BY order_column

    我认为这个解决方案比在ORDERBY子句中使用子查询性能更好