2016-03-18 2 views
-1

Я не совсем уверен, что я здесь делаю неправильно.Самый эффективный MySQL-запрос для не существует и сумма

У меня есть этот запрос, где я хочу получить u.id, если пользователь имеет заданное количество часов регистрации и не имеет зарегистрированного увеличения зарплаты. В этом случае только 1 должен быть выход, потому что не зарегистрировано ни одного rate_custom и num_hours больше, чем custom_hours, который 1000

У меня есть 3 таблицы: database tables

Это то, что я до сих пор , но я пробовал части этого без везения, так что мне просто интересно, есть ли более быстрый и эффективный способ справиться с этим, и тот, который действительно работает?

"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" 
     . ")"; 

ответ

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.

+0

Я думаю, что это сработало! Я вернусь к нему, как только полностью его выполнит. Как это будет работать для 100K записей в каждой таблице? – PhyCoMath

+0

@GjertIngarGjersund. , , Предполагая, что у вас есть индексы для ключей для объединений, «группа by» будет лимитирующим фактором в производительности. –

Смежные вопросы