嗨,我正在努力创建一个自定义列,当一个匹配是在一个不同的表中找到。
表结构:
表“联系人”包含表列
表Projects包含表列
表匹配“包含表列
这个问题
因此,例如,我想要检索联系人,其中有一个匹配的项目编号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的值,因为联系人是相同的。
提前谢谢你。
而不是那些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