このようなことを試すことができます(これをテストするのは実用的ではありませんが)
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条件に基づいて必要な行のみを選択する内部クエリにあります。これにより、両方のintの2つのフィールドのみがプルされるため、より小さなtmpテーブルが作成されます。
次に、外部クエリで、残りのデータを実際にプルするテーブル、順序、およびグループに結合します。このようにして、小さなデータセットで並べ替えとグループ化を行います。そして、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=?
したがって、その結合を完全に排除できます。