最有效的 MySQL 查询 not Exists 和 Sum
Most efficient MySQL query for not Exists and Sum
我不太确定我做错了什么。
我有这个查询,我想在其中获取 u.id
如果用户已经注册了超过设定的小时数,并且还没有注册加薪。在这种情况下,只有 1
应该是输出,因为没有注册 rate_custom
并且 num_hours
多于 custom_hours
即 1000
我有 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
.
我不太确定我做错了什么。
我有这个查询,我想在其中获取 u.id
如果用户已经注册了超过设定的小时数,并且还没有注册加薪。在这种情况下,只有 1
应该是输出,因为没有注册 rate_custom
并且 num_hours
多于 custom_hours
即 1000
我有 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
.