Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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,我有一个评级表(t2),用于按下限DESC对查询进行排序。问题是,下限的默认值必须是null或0。发生评级时,该行将使用Wilson的评级算法进行更新。这意味着,在下限DESC排序中,新条目比所有其他条目先排序,即使它们还没有评级(null或0小于0.2,在Wilson的评级算法中小于0.2) 为了解决这个问题,我添加了一个IF语句和子查询,该语句和子查询选择具有最大下限值的行,并向其添加+1。这样,对于下限具有空值的新条目将排在最后。它可以工作,但出于性能原因,我希望尽可能避免此类查询 这个o

我有一个评级表(t2),用于按
下限DESC
对查询进行排序。问题是,
下限
的默认值必须是
null
0
。发生评级时,该行将使用Wilson的评级算法进行更新。这意味着,在
下限DESC
排序中,新条目比所有其他条目先排序,即使它们还没有评级(null或0小于0.2,在Wilson的评级算法中小于0.2)

为了解决这个问题,我添加了一个
IF
语句和子查询,该语句和子查询选择具有最大
下限值的行,并向其添加+1。这样,对于
下限
具有空值的新条目将排在最后。它可以工作,但出于性能原因,我希望尽可能避免此类查询

这个
orderby
是否可以以一种更有效的方式完成,假设没有子查询

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

我认为您可以通过先根据
t2.lower_bound是否为NULL,然后根据实际值,即

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

这将确保所有具有
NULL
下限值的条目都排在最后,因为
t2.lower\u bound为NULL
对于它们将是1,而对于非
NULL
值将是0。我认为另一个解决方案是添加一个专门的列并使用该列进行排序

(t2.lower\u bound为NULL时为0,否则为1 END)作为订单列

然后将
order\u列
添加到orderby子句中

ORDER BY ORDER\u列

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