【问题标题】:Avoiding duplicates when joining a table to itself将表连接到自身时避免重复
【发布时间】:2020-05-04 12:39:24
【问题描述】:

我确信答案已经存在,但我正在努力将足够相似的帖子应用于我的具体问题。请多多包涵。

我有一个使用 id_parent_job 字段引用自身的作业表。子工作有许多空缺。

id  id_parent_job  is_active  num_openings
1   1              y          NULL
2   1              n          15
3   1              y          10
4   4              y          NULL
5   4              n          13
6   6              y          NULL
7   6              y          15
8   6              n          15
9   6              y          15

给定一个父职位 ID,我想找到 2 个数字:职位空缺总和和有效职位空缺总和。这是期望的结果。我需要查询方面的帮助。

job 1: 25 openings, 10 active openings
job 4: 13 openings, 0 active openings
job 6: 45 openings, 30 active openings

以下是我正在使用的查询,但它会导致重复。 This 是(也许?)对问题的一个很好的解释。

SELECT jobs.id, SUM(childjobs.num_openings), SUM(activechildjobs.num_openings) FROM jobs
    LEFT JOIN jobs AS childjobs
        ON childjobs.id_parent_job = jobs.id
        AND childjobs.id != jobs.id
    LEFT JOIN jobs AS activechildjobs
        ON activechildjobs.id_parent_job = jobs.id
        AND activechildjobs.id != jobs.id
        AND activechildjobs.is_active = 'y'
    WHERE jobs.id = 1

这是错误的结果。

job 1: 25 openings, 20 active openings
job 4: 13 openings, 0 active openings
job 6: 90 openings, 90 active openings

有多个孩子的工作会多次计算孩子。

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    您可以使用条件聚合和分组 id_parent_job 来避免导致记录重复(从而导致计数不正确)的 JOINs:

    SELECT id_parent_job AS id, 
           SUM(num_openings) AS openings,
           SUM(CASE WHEN is_active = 'y' THEN num_openings ELSE 0 END) AS active_openings
    FROM jobs
    GROUP BY id_parent_job
    

    输出:

    id  openings    active_openings
    1   25          10
    4   13          0
    6   45          30
    

    Demo on dbfiddle

    【讨论】:

    • 我的英雄!简洁的。有效的。谢谢。
    • @TaylorVance 刚刚意识到我是个白痴。我已经用正确的查询更新了答案。
    • 为什么要改变?原版有什么问题吗?它似乎更符合我的需求,因为我认为我需要从父工作起点开始,而不是像您的编辑那样从子工作开始。长话短说,在构建查询时,我无法更改很多基础设施。我真的只能控制查询的 SELECT 和 JOIN 部分。 jobs.id = 123(123 是父级)已经被烘焙了。
    • 我刚刚意识到联接中的父表没有添加任何内容。如果您认为原始形式的结构更适合您,尽管我可以恢复编辑。
    • 这是有道理的。是的,原版更适合我的情况,但这种方式通常可能会更好。也许两个都加?由你决定。
    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2013-12-18
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多