最有效的 MySQL 查询 not Exists 和 Sum

Most efficient MySQL query for not Exists and Sum

我不太确定我做错了什么。

我有这个查询,我想在其中获取 u.id 如果用户已经注册了超过设定的小时数,并且还没有注册加薪。在这种情况下,只有 1 应该是输出,因为没有注册 rate_custom 并且 num_hours 多于 custom_hours1000

我有 3 个表:

这是我目前得到的结果,但我尝试了其中的一部分但没有任何运气,所以我只是想知道是否有一种更快、更有效的方法来处理这个问题,并且确实有效?

"SELECT u.id "
        . "FROM users u "
        . "LEFT JOIN user_hours uh "
        . "ON u.id = uh.user_id "
        . "LEFT JOIN rate_custom rc "
        . "ON u.id = rc.user_id "
        . "WHERE "
        . "NOT EXISTS (r.crate_id FROM rate_custom r WHERE r.date_added <= NOW() AND r.date_ended IS NULL AND r.user_id = u.id) "
        . "GROUP BY u.id "
        . "HAVING SUM(("
        . "SELECT (THE NUM HOURS WHERE HOUR STATUS IS 4) "
        . ")) >= ("
        . "SELECT rcc.custom_hours FROM rate_custom rcc WHERE rcc.date_ended IS NULL ORDER BY rcc.crate_id DESC LIMIT 1"
        . ")";

如果我理解的逻辑正确,你可以这样做:

SELECT u.id 
FROM users u LEFT JOIN
     user_hours uh
     ON u.id = uh.user_id LEFT JOIN
     rate_custom rc
     ON u.id = rc.user_id 
WHERE rc.user_id IS NULL
GROUP BY u.id
HAVING SUM(CASE WHEN hour_status = 4 THEN num_hours ELSE 0 END) >= 
           (SELECT rcc.custom_hours FROM rate_custom rcc WHERE rcc.date_ended IS NULL ORDER BY rcc.crate_id DESC LIMIT 1);

您不需要子查询来查找 rate_custom 的不匹配项; LEFT JOIN 就是这样做的。对于 HAVING 子句,您可以使用 CASE.