简体   繁体   English

联合子查询中的MySQL外查询引用不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM