首页 > 解决方案 > 当在其他表中找到匹配项时,如何设置具有布尔值的自定义列?

问题描述

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

表结构:

表联系人包含表列

表项目包含表列

表匹配包含表列

问题

因此,例如,我想检索与项目编号 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 为真,第二条记录显示 project2 为真。现在我只需要 project1 和 project2 的值在一行中,因为联系人是相同的。

提前致谢。

标签: mysqljoinselectgroup-bypivot

解决方案


您可以进行条件聚合:

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

推荐阅读