Bạn có thể thử các truy vấn tại http://sqlfiddle.com/#!9/839d2/1
Truy vấn 1
Danh sách tất cả các hành tinh có thuyền trưởng. Nó hiển thị id_planet, hành tinh_name, tổng số đội trưởng trên mỗi hành tinh đó cũng như số lượng trận chiến (nếu có) đã diễn ra ở đó.
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';
Bạn có thể có kết quả tương tự bằng cách sử dụng cái này:
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';
Truy vấn 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;
Ở đây, tôi đã không sử dụng Tham gia để tính toán number_of_soldiers và number_of_battles như tôi đã thực hiện ở Truy vấn 1.1 vì đó sẽ là một truy vấn con tương quan và do đó, nó không thể có quyền truy cập ở các truy vấn bên ngoài ( https://dev.mysql.com/doc/refman/5.5/en/from-clause -subqueries.html ).
Truy vấn sai:
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';
Vì vậy, truy vấn trên là sai và tạo ra lỗi:Cột không xác định 'aa.id_planet' trong 'mệnh đề where'.
Đối với truy vấn thứ hai mà bạn yêu cầu, tôi hy vọng ai đó có thể thử.