我有以下MySQL表:
表company
方含以下属性(约250行):
表event
方含以下属性(约20行):
交叉表cpy_evt
(约550行)定义了什么产品涉及什么事件。该表格包含一个公司和事件之间的关联每一个行。该表包含以下属性:
由于我有限的SQL的知识,我有以下问题。
如何选择:
非常感谢你的帮助!汉纳斯
- 所有企业(所有属性)中涉及的事件A
不知道你的数据,我会去更安全的方法,以避免潜在的重复:一个EXISTS条件与相关子查询。
SELECT c.*
FROM company c
WHERE EXISTS (
SELECT 1
FROM company_event ce
INNER JOIN event e ON e.name_evt = 'A' AND e.id_evt = ce.id_evt_crs
WHERE ce.id_cpy_crs = c.id_cpy
)
- 中涉及的事件A和事件B的所有公司
您可以添加额外的EXISTS条件:
SELECT c.*
FROM company c
WHERE EXISTS (
SELECT 1
FROM company_event ce
INNER JOIN event e ON e.name_evt = 'A' AND e.id_evt = ce.id_evt_crs
WHERE ce.id_cpy_crs = c.id_cpy
)
AND EXISTS (
SELECT 1
FROM company_event ce
INNER JOIN event e ON e.name_evt = 'B' AND e.id_evt = ce.id_evt_crs
WHERE ce.id_cpy_crs = c.id_cpy
)
- 中涉及的事件A和事件B的所有公司
更改事件名称平等条件IN条件。
SELECT c.*
FROM company c
WHERE EXISTS (
SELECT 1
FROM company_event ce
INNER JOIN event e ON e.name_evt IN ('A', 'B') AND e.id_evt = ce.id_evt_crs
WHERE ce.id_cpy_crs = c.id_cpy
)
- 未参与任何活动的所有公司
这简化了子查询,因为我们并不需要加入事件表。
SELECT c.*
FROM company c
WHERE NOT EXISTS (
SELECT 1
FROM company_event ce
WHERE ce.id_cpy_crs = c.id_cpy
)