आप क्वेरी को http://sqlfiddle.com/#!9/839d2/1 पर आज़मा सकते हैं
प्रश्न 1
उन सभी ग्रहों की सूची जिनके कप्तान हैं। यह id_planet, Planet_name, उनमें से प्रत्येक ग्रह पर कुल कप्तानों के साथ-साथ वहां हुई लड़ाइयों (यदि कोई हो) की संख्या दिखाता है।
SELECT DISTINCT aa.id_planet, aa.planet_name, _aa.captains_count, _bb.battles_count
FROM planet AS aa
INNER JOIN soldier AS bb
ON aa.id_planet = bb.planet_id
INNER JOIN (
SELECT planet_id, COUNT(*) AS captains_count
FROM soldier
WHERE rank = 'captain'
GROUP BY planet_id
) AS _aa
ON aa.id_planet = _aa.planet_id
LEFT JOIN (
SELECT id_planet_battle, COUNT(*) AS battles_count
FROM battle
GROUP BY id_planet_battle
) AS _bb
ON aa.id_planet = _bb.id_planet_battle
WHERE bb.rank = 'captain';
इसका उपयोग करके आप समान परिणाम प्राप्त कर सकते हैं:
SELECT DISTINCT aa.id_planet, aa.planet_name,
(
SELECT COUNT(*)
FROM soldier AS _aa
WHERE _aa.rank = 'captain' AND aa.id_planet = _aa.planet_id
GROUP BY _aa.planet_id
) AS captains_count,
(
SELECT COUNT(*)
FROM battle AS _bb
WHERE aa.id_planet = _bb.id_planet_battle
GROUP BY _bb.id_planet_battle
) AS battles_count
FROM planet AS aa
INNER JOIN soldier AS bb
ON aa.id_planet = bb.planet_id
WHERE bb.rank = 'captain';
प्रश्न 3
SELECT aa.name, aa.rank, bb.planet_name AS planet_from, (
SELECT COUNT(*)
FROM soldier AS _aa
WHERE _aa.planet_id = aa.planet_id
) AS number_of_soldiers,
(
SELECT COUNT(*)
FROM battle AS _bb
WHERE _bb.id_planet_battle = aa.planet_id
) AS number_of_battles
FROM soldier AS aa
INNER JOIN planet AS bb
ON aa.planet_id = bb.id_planet;
यहां, मैंने जॉइन का उपयोग number_of_soldiers और number_of_battles की गणना करने के लिए नहीं किया जैसा कि मैंने क्वेरी 1.1 में किया था क्योंकि यह एक सहसंबद्ध सबक्वायरी होगी और इस तरह बाहरी प्रश्नों तक इसकी पहुंच नहीं हो सकती थी (https://dev.mysql.com/doc/refman/5.5/en/from-clause -subqueries.html )।
गलत क्वेरी:
SELECT DISTINCT aa.id_planet, aa.planet_name, _aa.captains_count, _bb.battles_count
FROM planet AS aa
INNER JOIN soldier AS bb
ON aa.id_planet = bb.planet_id
INNER JOIN (
SELECT COUNT(*) AS captains_count
FROM soldier AS _aa
WHERE _aa.rank = 'captain' AND aa.id_planet = _aa.planet_id
GROUP BY _aa.planet_id
) AS _aa
ON aa.id_planet = _aa.planet_id
LEFT JOIN (
SELECT COUNT(*) AS battles_count
FROM battle AS _bb
WHERE aa.id_planet = _bb.id_planet_battle
GROUP BY _bb.id_planet_battle
) AS _bb
ON aa.id_planet = _bb.id_planet_battle
WHERE bb.rank = 'captain';
तो उपरोक्त क्वेरी गलत है और त्रुटि उत्पन्न करती है:अज्ञात कॉलम 'aa.id_planet' 'कहां क्लॉज' में।
जहाँ तक आपके द्वारा पूछे गए दूसरे प्रश्न का सवाल है, मुझे आशा है कि कोई और इसे आज़मा सकता है।