Du kan prøve noget som dette (selvom det ikke er praktisk for mig at teste dette)
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
Så jeg håber ikke, jeg har rodet noget ud.
I hvert fald er ideen i den indre forespørgsel, at du kun vælger de rækker, du har brug for, baseret på din where-tilstand. Dette vil skabe en mindre tmp-tabel, da den kun trækker 2 felter begge ints.
Så i den ydre forespørgsel slutter du dig til de tabeller, som du faktisk trækker resten af data fra, rækkefølge og gruppere. På denne måde sorterer og grupperer du på et mindre datasæt. Og din where-klausul kan køre på den mest optimale måde.
Du kan endda være i stand til at udelade nogle af disse tabeller, da du kun trækker data fra nogle få af dem, men uden at se det fulde skema og hvordan det er relateret, er det svært at sige.
Men generelt set denne del (underforespørgslen)
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
Er det, der er direkte påvirket af din WHERE-klausul. Se, så vi kan optimere denne del, og brug den derefter til at samle resten af de data, du har brug for.
Et eksempel på fjernelse af tabeller kan let udledes af ovenstående, overvej dette
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
tabel cluster
bruges aldrig til at trække data fra, kun for hvor. Så er det ikke
JOIN cluster c ON sc.cluster_id = c.cluster_id
WHERE
c.cluster_id=?
Det samme som eller svarende til
WHERE
sc.cluster_id=?
Og derfor kan vi helt fjerne den joinforbindelse.