Я создаю страницу статистики для пользователей моего сайта, чтобы увидеть, насколько они взаимодействуют с различными функциями.На сайте они могут выполнять четыре вида деятельности, получать за них баллы и оставлять отзывы другим пользователям об их ответах.Все они записаны в базе данных.
- В таблицах точек строка создается, когда пользователь впервые что-то делает, например, просматривает конкретное видео.Для каждого видео добавлена новая строка.
- В таблицах обратной связи создается строка для каждой уникальной части обратной связи с идентификатором пользователя, обратной связью и т. Д.
Проблема IЯ имею в виду, что в то время как два типа соединения работают, чтобы получить ожидаемый результат, INNER JOIN и LEFT JOIN, они имеют радикально различное время выполнения.
- LEFT JOIN выполняется, но выполняется вечно (и впоследствии приводит к сбою моего компьютера с малой памятью!).
- INNER JOIN выполняется, но только если во всех таблицах есть хотя бы одна подходящая строка для пользователя.
Поэтому я уверен, что здесь я пропускаю какой-то шаг эффективности или неправильно понимаю использование объединений в этом контексте.Я мог бы использовать помощь, глядя на оператор SQL и глядя на то, как его можно улучшить.
Fiddle Link: http://sqlfiddle.com/#!9/9dce51 (с ограниченными данными из-за размера!)
Проблемы с группами из восьми ниже - остальные запросы выполняются быстро и правильно.
SELECT users.forename, users.surname, users.email,
users_peer_request.user_id, COUNT(DISTINCT users_peer_request.id) as peer_req_cnt,
COUNT(DISTINCT users_self_assessment.id) AS self_assess_cnt, AVG(users_self_assessment.assessment) AS self_assess_avg,
GROUP_CONCAT(DISTINCT classes.name, '-', classes.id SEPARATOR ',') AS classes,
COUNT(DISTINCT a_experiment_points.id) AS tried_exp,
COUNT(DISTINCT a_phetlabs_points.id) AS tried_phet,
COUNT(DISTINCT a_videonotes_points.id) AS tried_video,
COUNT(DISTINCT a_working_points.id) AS tried_work,
COUNT(DISTINCT a_experiment_feedback.id) AS fb_exp,
COUNT(DISTINCT a_phetlab_feedback.id) AS fb_phet,
COUNT(DISTINCT a_videonotes_feedback.id) AS fb_video,
COUNT(DISTINCT a_working_feedback.id) AS fb_work
FROM users_peer_request
LEFT JOIN classes ON classes.id IN (SELECT classes_students.class_id FROM classes_students WHERE classes_students.student_id = users_peer_request.user_id)
LEFT JOIN users ON users.gid = users_peer_request.user_id
LEFT JOIN users_self_assessment ON users_self_assessment.user_id = users_peer_request.user_id
INNER JOIN a_experiment_points ON a_experiment_points.user_id = users_peer_request.user_id
INNER JOIN a_phetlabs_points ON a_phetlabs_points.user_id = users_peer_request.user_id
INNER JOIN a_videonotes_points ON a_videonotes_points.user_id = users_peer_request.user_id
INNER JOIN a_working_points ON a_working_points.user_id = users_peer_request.user_id
INNER JOIN a_experiment_feedback ON a_experiment_feedback.user_fb_id = users_peer_request.user_id
INNER JOIN a_phetlab_feedback ON a_phetlab_feedback.user_fb_id = users_peer_request.user_id
INNER JOIN a_videonotes_feedback ON a_videonotes_feedback.user_id_fb = users_peer_request.user_id
INNER JOIN a_working_feedback ON a_working_feedback.user_fb_id = users_peer_request.user_id
WHERE users_peer_request.user_id = 123456789123456789123456
GROUP BY users_peer_request.user_id
Этот запрос выполняется на скрипте, если, я надеюсь, он возвращает NULL или 0, если пользователь не отображается в таблице, и число, в противном случае это значение считается.
Большое спасибо,Я надеюсь, что у вас есть достаточно деталей здесь, но если нет, пожалуйста, спросите:)