Можете да опитате нещо подобно (въпреки че не е практично за мен да тествам това)
SELECT
sac.surveyId,
q.cat,
SUM((sac.answer_id*q.weight))/SUM(q.weight) AS score,
user.division_id,
user.unit_id,
user.department_id,
user.team_id,
division.division_name,
unit.unit_name,
dpt.department_name,
team.team_name
FROM survey_answers_cache sac
JOIN
(
SELECT
s.surveyId,
sc.subcluster_id
FROM
surveys s
JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id
JOIN cluster c ON sc.cluster_id = c.cluster_id
WHERE
c.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0
) AS v ON v.surveyid = sac.surveyid
JOIN user ON user.user_id = sac.user_id
JOIN questions q ON q.question_id = sac.question_id
JOIN division ON division.division_id = user.division_id
LEFT JOIN unit ON unit.unit_id = user.unit_id
LEFT JOIN department dpt ON dpt.department_id = user.department_id
LEFT JOIN team ON team.team_id = user.team_id
GROUP BY user.team_id, v.surveyId, q.cat
ORDER BY v.surveyId, user.team_id, q.cat ASC
Така че се надявам да не съм объркал нещо.
Както и да е, идеята е във вътрешната заявка да изберете само редовете, от които се нуждаете въз основа на вашето условие where. Това ще създаде по-малка tmp таблица, тъй като изтегля само 2 полета и двете int.
След това във външната заявка се присъединявате към таблиците, от които всъщност извличате останалите данни, подреждате и групирате. По този начин вие сортирате и групирате върху по-малък набор от данни. И вашата клауза where може да работи по най-оптималния начин.
Може дори да сте в състояние да пропуснете някои от тези таблици, тъй като изтегляте само данни от няколко от тях, но без да видите пълната схема и как е свързана, е трудно да се каже.
Но най-общо казано тази част (подзаявката)
SELECT
s.surveyId,
sc.subcluster_id
FROM
surveys s
JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id
JOIN cluster c ON sc.cluster_id = c.cluster_id
WHERE
c.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0
Е това, което е пряко засегнато от вашата клауза WHERE. Вижте, за да можем да оптимизираме тази част, след което да я използваме, за да обединим останалите данни, от които се нуждаете.
Пример за премахване на таблици може лесно да бъде изведен от горното, помислете за това
SELECT
s.surveyId,
sc.subcluster_id
FROM
surveys s
JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id
WHERE
sc.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0
c
таблица cluster
никога не се използва за изтегляне на данни от, само за къде. Така че не е
JOIN cluster c ON sc.cluster_id = c.cluster_id
WHERE
c.cluster_id=?
Същото или еквивалентно на
WHERE
sc.cluster_id=?
И следователно можем да премахнем това присъединяване напълно.