mysql - 当在其他表中找到匹配项时,如何设置具有布尔值的自定义列?
问题描述
嗨,我正在努力创建一个自定义列,以便在不同的表中找到匹配项。
表结构:
表联系人包含表列
- ID
- 其他一些对我的问题无关紧要的专栏
表项目包含表列
- ID
- 姓名
表匹配包含表列
- ID
- 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 为真,第二条记录显示 project2 为真。现在我只需要 project1 和 project2 的值在一行中,因为联系人是相同的。
提前致谢。
解决方案
您可以进行条件聚合:
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
推荐阅读
- laravel - 无法更新某个字段 Laravel Elequent
- javascript - 如何为我的案例使用 Express Error 中间件?
- angularjs - 找不到名称错误 - 如何以角度从 node_modules/@types 导入定义文件?
- python - 为什么应该由 matplotlib Axis 包含的 Line2D 对象显示为空?
- php - Laravel 身份验证。如何将表“用户”更改为表“员工”?
- android - 在滚动协调器布局上显示和隐藏布局
- c - 程序正在打印带有附加元素和垃圾值的数组
- scala - 转换数组
- python - 如何在 kivy 应用程序退出时运行方法
- matlab - 在 Simscape 中针对弹簧质量阻尼器系统使用理想平移速度和不理想力源时遇到警告