Я не совсем уверен, что я делаю здесь не так.
У меня есть этот запрос, где я хочу получить u.id
если пользователь зарегистрировался в течение установленного количества часов и еще не зарегистрировал повышение заработной платы. Только в этом случае 1
должен быть выход, потому что нет зарегистрированных rate_custom
а также num_hours
больше чем custom_hours
то есть 1000
Это то, что я получил до сих пор, но я попробовал некоторые части без какой-либо удачи, поэтому мне просто интересно, есть ли более быстрый и эффективный способ справиться с этим, и который действительно работает?
"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
,
Других решений пока нет …