提问者:小点点

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


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

表结构:

表“联系人”包含表列

  • ID
  • 与我的问题无关的其他一些专栏

表Projects包含表列

  • ID
  • 姓名

表匹配“包含表列

  • ID
  • PROJECT_ID(等于项目表id)
  • contact_id(等于联系人表id)

这个问题

因此,例如,我想要检索联系人,其中有一个匹配的项目编号1和2。 通过左联接,我将基于联系人“ID”连接联系人信息,该联系人“ID”与matches表中的“contact_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 

当我省略这一组时,它显示两个正确的结果,第一个记录显示project1为真,第二个记录显示project2为真。 现在我只需要一行中project1和project2的值,因为联系人是相同的。

提前谢谢你。


共1个答案

匿名用户

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

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