【问题标题】:MySQL outer query reference in a union subquery not working联合子查询中的 MySQL 外部查询引用不起作用
【发布时间】:2017-04-08 19:59:51
【问题描述】:

谁能帮我重建以下 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;

查询应该计算来自两个来源的所有不同学生,并按合同对他们进行分组。

问题是对 c.id 的子查询引用。显然,子查询对合约表一无所知。

我非常感谢帮助使它工作。

谢谢!

【问题讨论】:

  • 简化。添加示例表数据和预期结果(以及格式化文本。)
  • 如果你使用了显式连接就会这样。
  • @P.Salmon 不,这无济于事。子查询不能引用外部查询中的表(除了相关的子查询,这不是)。
  • 为什么需要加入contract 表?除了c.id,你没有使用那里的任何东西,它与cs2.contract 相同。

标签: mysql sql


【解决方案1】:

您需要在子查询中选择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;

此外,由于UNION 会从子查询中删除重复项,因此您无需在COUNT() 中使用DISTINCT。

【讨论】:

  • 你可能不需要外部的join。只需按contract 汇总即可。
  • 好点——也许他简化了查询并省略了contracts 中的其他列。我会等他回答我上面的评论。
  • 我认为它有效!我会在完成测试后立即接受这个答案。谢谢!
猜你喜欢
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多