MySQL:Select 通过关联

MySQL: Select via association

我有以下 MySQL tables:

Table company 包含以下属性(大约 250 行):

Table event 包含以下属性(大约 20 行):

Cross table cpy_evt(约550行)定义什么公司参与什么事件。 table 公司和事件之间的每个关联包含一行。 table 包含以下属性:

由于我的SQL知识有限,我有以下问题。

我怎样才能select:

  1. 事件 A 涉及的所有公司(所有属性)
  2. 所有参与事件 A 和事件 B 的公司
  3. 所有参与事件 A 或事件 B 的公司
  4. 所有未参与任何事件的公司

非常感谢您的帮助! 汉内斯

  1. 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
)
  1. 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
)
  1. 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
)
  1. 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
)