MySQL:Select 通过关联
MySQL: Select via association
我有以下 MySQL tables:
Table company
包含以下属性(大约 250 行):
- id_cpy(整数)
- name_cpy (varchar)
- xxx_cpy(更多公司属性)
Table event
包含以下属性(大约 20 行):
- id_evt(整数)
- name_evt (varchar)
- xxx_evt((更多事件属性)
Cross table cpy_evt
(约550行)定义什么公司参与什么事件。 table 公司和事件之间的每个关联包含一行。 table 包含以下属性:
- id_crs
- id_cpy_crs
- id_evt_crs
由于我的SQL知识有限,我有以下问题。
我怎样才能select:
- 事件 A 涉及的所有公司(所有属性)
- 所有参与事件 A 和事件 B 的公司
- 所有参与事件 A 或事件 B 的公司
- 所有未参与任何事件的公司
非常感谢您的帮助!
汉内斯
- All companies (all attributes) that are involved in event 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
)
- All companies that are involved in event A AND event 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
)
- All companies that are involved in event A OR event 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
)
- All companies that are not involved in any event
这简化了子查询,因为我们不需要加入事件 table。
SELECT c.*
FROM company c
WHERE NOT EXISTS (
SELECT 1
FROM company_event ce
WHERE ce.id_cpy_crs = c.id_cpy
)
我有以下 MySQL tables:
Table company
包含以下属性(大约 250 行):
- id_cpy(整数)
- name_cpy (varchar)
- xxx_cpy(更多公司属性)
Table event
包含以下属性(大约 20 行):
- id_evt(整数)
- name_evt (varchar)
- xxx_evt((更多事件属性)
Cross table cpy_evt
(约550行)定义什么公司参与什么事件。 table 公司和事件之间的每个关联包含一行。 table 包含以下属性:
- id_crs
- id_cpy_crs
- id_evt_crs
由于我的SQL知识有限,我有以下问题。
我怎样才能select:
- 事件 A 涉及的所有公司(所有属性)
- 所有参与事件 A 和事件 B 的公司
- 所有参与事件 A 或事件 B 的公司
- 所有未参与任何事件的公司
非常感谢您的帮助! 汉内斯
- All companies (all attributes) that are involved in event 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
)
- All companies that are involved in event A AND event 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
)
- All companies that are involved in event A OR event 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
)
- All companies that are not involved in any event
这简化了子查询,因为我们不需要加入事件 table。
SELECT c.*
FROM company c
WHERE NOT EXISTS (
SELECT 1
FROM company_event ce
WHERE ce.id_cpy_crs = c.id_cpy
)