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