我有以下MySQL表:
表company
包含以下属性(约250行):
表event
包含以下属性(约20行):
交叉表cpy_evt
(约550行)定义了哪个公司参与了什么事件。该表在公司和事件之间的每个关联中包含一行。该表包含以下属性:
由于我有限的SQL知识,我有以下问题。
如何选择:
非常感谢您的帮助! 汉尼斯
答案 0 :(得分:1)
- 事件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
)