[英]MySQL outer query reference in a union subquery not working
Could anyone help me rebuild the following MySQL query so it works: 任何人都可以帮助我重建以下MySQL查询,以便它起作用:
SELECT c.id, COUNT(DISTINCT d.student_id) FROM contract c, (
SELECT student_id FROM ilc_course ic, contract_seat cs2
WHERE c.id = cs2.contract
AND cs2.id = ic.contract_seat
AND ic.valid = 1 AND cs2.valid = 1
AND (ic.finished IS NULL OR ic.finished > CURRENT_TIMESTAMP)
UNION
SELECT student_id FROM glc_to_user_profile_student gtups, glc_course gc, contract_seat cs2
WHERE c.id = cs2.contract
AND gtups.contract_seat = cs2.id AND gtups.glc_course = gc.id
AND gtups.valid = 1 AND gc.valid = 1 AND cs2.valid = 1
AND (gtups.left_date IS NULL OR gtups.left_date > CURRENT_TIMESTAMP)
AND (gc.end_date IS NULL OR gc.end_date > CURRENT_TIMESTAMP)
) d GROUP BY c.id;
The query is supposed to count all distinct students from two sources and group them by the contract. 该查询应该统计来自两个来源的所有不同学生,并将他们按合同分组。
The problem is the subquery reference to c.id. 问题是对c.id的子查询引用。 Clearly, the subqueries don't know anything about the contract table.
显然,子查询对合同表一无所知。
I would very much appreciate help making it work. 我非常感谢您的帮助,以使其能够正常工作。
Thanks! 谢谢!
You need to select cs2.contract
in the subqueries, and then join that with c.id
in the outer query. 您需要在子查询中选择
cs2.contract
,然后在外部查询中将其与c.id
结合在一起。
SELECT c.id, COUNT(d.student_id)
FROM contract c
JOIN (
SELECT cs2.contract, student_id
FROM ilc_course ic
JOIN contract_seat cs2 ON cs2.id = ic.contract_seat
WHERE ic.valid = 1 AND cs2.valid = 1
AND (ic.finished IS NULL OR ic.finished > CURRENT_TIMESTAMP)
UNION
SELECT cs2.contract, student_id
FROM glc_to_user_profile_student gtups
JOIN glc_course gc ON gtups.glc_course = gc.id
JOIN contract_seat cs2 ON gtups.contract_seat = cs2.id
WHERE gtups.valid = 1 AND gc.valid = 1 AND cs2.valid = 1
AND (gtups.left_date IS NULL OR gtups.left_date > CURRENT_TIMESTAMP)
AND (gc.end_date IS NULL OR gc.end_date > CURRENT_TIMESTAMP)
) d ON c.id = d.contract
GROUP BY c.id;
Also, since UNION
removes duplicates from the subqueries, you don't need to use DISTINCT
in COUNT()
. 此外,由于
UNION
会从子查询中删除重复项,因此您无需在COUNT()
使用DISTINCT
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.