आप कुछ इस तरह की कोशिश कर सकते हैं (हालांकि इसका परीक्षण करना मेरे लिए व्यावहारिक नहीं है)
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
इसलिए मुझे आशा है कि मैंने कुछ गड़बड़ नहीं की।
वैसे भी, विचार आंतरिक क्वेरी में है कि आप अपनी स्थिति के आधार पर केवल उन पंक्तियों का चयन करते हैं जिनकी आपको आवश्यकता है। यह एक छोटी tmp तालिका बनाएगा क्योंकि यह केवल 2 फ़ील्ड दोनों ints को खींचती है।
फिर बाहरी क्वेरी में आप उन तालिकाओं में शामिल होते हैं जिन्हें आप वास्तव में शेष डेटा, ऑर्डर और समूह से खींचते हैं। इस तरह आप छोटे डेटासेट पर सॉर्ट और ग्रुप कर रहे हैं। और आपका जहां क्लॉज सबसे इष्टतम तरीके से चल सकता है।
आप इनमें से कुछ तालिकाओं को छोड़ भी सकते हैं क्योंकि उनमें से कुछ से केवल डेटा खींच रहा है, लेकिन पूर्ण स्कीमा को देखे बिना और यह कैसे संबंधित है, यह कहना मुश्किल है।
लेकिन आम तौर पर इस भाग (उप-क्वेरी) को बोलते हुए
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=?
और इसलिए हम उस जुड़ाव को पूरी तरह समाप्त कर सकते हैं।