Mysql不需要一个转折就能到达目的地

Mysql不需要一个转折就能到达目的地,mysql,sql,subquery,inner-join,having-clause,Mysql,Sql,Subquery,Inner Join,Having Clause,我想找那些没有联系方式的公司,这是我的模式 Firms table +----+-------+ | id | name | +----+-------+ | 1 | Firm1 | | 2 | Firm2 | | 3 | Firm3 | +----+-------+ Contacts +----+----------+---------+ | id | label | firm_id | +----+----------+---------+ | 1 | Contact1 |

我想找那些没有联系方式的公司,这是我的模式

Firms table +----+-------+ | id | name | +----+-------+ | 1 | Firm1 | | 2 | Firm2 | | 3 | Firm3 | +----+-------+ Contacts +----+----------+---------+ | id | label | firm_id | +----+----------+---------+ | 1 | Contact1 | 1 | | 2 | Contact2 | 1 | | 3 | Contact3 | 2 | | 4 | Contact4 | 3 | +----+----------+---------+ contact_methods +----+-------------+------------+ | id | method_type | contact_id | +----+-------------+------------+ | 1 | main_phone | 1 | | 2 | main_fax | 1 | | 3 | email | 1 | | 4 | main_fax | 4 | | 5 | main_fax | 3 | | 6 | phone | 2 | | 7 | main_mobile | 1 | | 8 | url | 4 | +----+-------------+------------+ 公司表 +----+-------+ |id |名称| +----+-------+ |1 |公司1| |2 |公司2| |3 |坚定3| +----+-------+ 联络 +----+----------+---------+ |id |标签|公司id| +----+----------+---------+ |1 |联系方式1 | 1| |2 |联系方式2 | 1| |3 |联系方式3 | 2| |4 |联系方式4 | 3| +----+----------+---------+ 联系方式 +----+-------------+------------+ |id |方法|类型|联系人| id| +----+-------------+------------+ |1 |主电话| 1| |2 |主|传真| 1| |3 |电子邮件| 1| |4 |主传真| 4| |5 |主传真| 3| |6 |电话| 2| |7 |主移动电话| 1| |8 | url | 4| +----+-------------+------------+ 这是我的问题

SELECT firms.id FROM firms JOIN contacts ON (contactable_id = firms.id) JOIN contact_methods ON contacts.id = contact_methods.contact_id WHERE firms.active = 1 AND contact_methods.method_type NOT IN ('mobile','phone','main_mobile','main_phone') 挑选 公司id 来自公司 在上加入联系人(contactable_id=firms.id) 在contacts.id=contact\u methods.contact\u id上加入contact\u方法 哪里 1.active=1 及 联系方式。方式类型不在('mobile'、'phone'、'main\u mobile'、'main\u phone')
我正在获取所有公司:s

您的代码检查每个公司是否有任何不属于列表的联系人类型,而您希望确保所有公司联系人都不属于列表

一个选项使用聚合:

select f.*
from firm f
left join contacts c on c.firm_id = f.id
left join contact_methods cm on cm.contact_id = c.id
group by f.id
having not max(cm.method_type in ('mobile','phone','main_mobile','main_phone')) <=> 1
此任务中不需要联系方法

如果您需要相同的特定触点类型,则使用:

SELECT *
FROM firms
WHERE NOT EXIST ( SELECT NULL
                  FROM contacts
                  JOIN contact_methods ON contacts.id = contact_methods.contact_id 
                  WHERE firms.id = contacts.firm_id
                    AND contact_methods.method_type NOT IN ({types list}) )


我只需要在('mobile'、'phone'、'main_mobile'、'main_phone'中没有联系方式的firms.id)


我通过Contact1收到所有公司的传真和电子邮件。Firm2通过Contact3进行主传真。Firm3通过Contact4提供主传真和url。PS.
firms.active
列不存在。显示显示的源数据的所需输出。只需删除它(其中firms.active=1)我只需要在('mobile'、'phone'、'main_mobile'、'main_phone'中没有联系方式的firms.id)显示的示例数据中没有这样的行。这将不起作用=)@Othmanebouhena根据问题的最后一条评论进行了更新。看起来不错,但它花费了太多时间:s甚至没有得到结果
SELECT *
FROM firms
WHERE NOT EXIST ( SELECT NULL
                  FROM contacts
                  WHERE firms.id = contacts.firm_id )
SELECT *
FROM firms
WHERE NOT EXIST ( SELECT NULL
                  FROM contacts
                  JOIN contact_methods ON contacts.id = contact_methods.contact_id 
                  WHERE firms.id = contacts.firm_id
                    AND contact_methods.method_type NOT IN ({types list}) )
SELECT *
FROM firms
WHERE NOT EXIST ( SELECT NULL
                  FROM contacts
                  JOIN contact_methods ON contacts.id = contact_methods.contact_id 
                  WHERE firms.id = contacts.firm_id
                    AND contact_methods.method_type IN ('mobile', 'phone', 'main_mobile', 'main_phone') )