【问题标题】:How can I set a custom column with a boolean value when a match is found in a other table?当在其他表中找到匹配项时,如何设置具有布尔值的自定义列?
【发布时间】:2020-06-27 14:13:04
【问题描述】:

您好,我正在努力创建一个自定义列,以便在不同的表中找到匹配项。

表结构:

表格联系人包含表格列

  • 身份证
  • 其他一些与我的问题无关的专栏

Table Projects 包含表格列

  • 身份证
  • 姓名

表格匹配包含表格列

  • 身份证
  • project_id(等于项目表id)
  • contact_id(等于联系表id)

问题

例如,我想检索与项目编号 1 和 2 匹配的联系人。 使用左连接,我将根据与匹配表中的“contact_id”匹配的联系人“id”连接联系人信息。 现在我想向该联系人添加一列,说明该联系人是项目 1 或/和 2 的一部分

所以输出应该是,如果存在联系人,则与项目 ID 为 1 和/或项目 ID 为 2 的表匹配。

表格应如下所示:

联系方式 id,(联系默认列对我的问题不重要)、project1、project2 等

123,(一些默认列),1,0(例如)

我不想要的是,在输出表中,同一个联系人多次出现,只是在 project1 列或 project2 列中设置了不同的值。因此,联系人需要按某种方式分组! 此外,不应限制可以作为列显示的项目数量,因为一个联系人可以连接到 10 个项目。

我想出了这么多。

SELECT contacts.*, (fields project1 and project2, etc. more columns when there are more matches)  
FROM contacts 
 LEFT JOIN matches on contacts.id = matches.contact_id
 LEFT JOIN projects ON projects.project_id = matches.project_id
GROUP BY contacts.id

有没有人可以帮助我解决这个问题。因为这一点我不再知道如何解决这个问题,所以我尝试了多种方法都没有给我上述结果。

如果需要创建更多的左连接,那没问题,我可以实现。

新增

所以我设法做到了这一点,但是这个查询只显示了值为 true 的 project1 但 project1 和 project2 在这种情况下应该是 true 但它不是因为它被分组在 contact.id 上,这导致只显示从匹配的表格中找到的第一个记录,在这种情况下是 id 为 1 的联系人与项目 id 为 1 之间的连接。

SELECT contacts.* , 
 IF(matches.project_id = 1, true,false ) as project1, 
 IF(matches.project_id = 2, true,false ) as project2
FROM contacts
 LEFT JOIN matches ON matches.contact_id = contacts.id
 LEFT JOIN projects ON projects.id = matches.project_id
GROUP BY contacts.id 

当我离开该组时,它会显示 2 个正确的结果 第一条记录显示 project1 为 true 第二条记录显示 project2 为 true。 现在我只需要 project1 和 project2 的值在一行 sins 联系人是一样的。

提前致谢。

【问题讨论】:

    标签: mysql join select group-by pivot


    【解决方案1】:

    而不是那些IFs 使用条件聚合:

    SELECT contacts.*, 
      MAX(matches.project_id = 1) as project1, 
      MAX(matches.project_id = 2) as project2
    FROM contacts
     LEFT JOIN matches ON matches.contact_id = contacts.id
     LEFT JOIN projects ON projects.id = matches.project_id
    GROUP BY contacts.id
    

    【讨论】:

    • 感谢这帮助我们找到了正确的组合。
    【解决方案2】:

    你可以做条件聚合:

    select 
        c.id,
        max(m,project_id = 1) has_project_1, 
        max(m,project_id = 2) has_project_2
    from contacts c
    left join matches m 
        on m.contact_id = c.id
        and m.project_id in (1, 2)
    group by c.id
    

    注意事项:

    • 您无需引入projects 表即可获得您想要的结果。

    • 您可以预先过滤与您感兴趣的项目的联接,以限制要聚合的行数。

    • 表别名使查询更易于编写、读取和维护。

    但实际上,两个左连接可能更有效:

    select
        c.*,
        (m1.project_id is not null) hzs_project_1,
        (m2.project_id is not null) hzs_project_2
    from contact c
    left join matches m1
        on m1.contact_id = c.id
        and m1.project_id = 1
    left join matches m3
        on m2.contact_id = c.id
        and m2.project_id = 2
    

    【讨论】:

    • 感谢这帮助我们找到了正确的组合。
    猜你喜欢
    • 2015-09-27
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2023-04-01
    相关资源
    最近更新 更多