MySQL:通过关联选择

时间:2019-02-09 16:32:42

标签: mysql sql select associations

我有以下MySQL表:

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

  • id_cpy(int)
  • name_cpy(varchar)
  • xxx_cpy(更多公司属性)

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

  • id_evt(int)
  • name_evt(varchar)
  • xxx_evt((更多事件属性)

交叉表cpy_evt (约550行)定义了哪个公司参与了什么事件。该表在公司和事件之间的每个关联中包含一行。该表包含以下属性:

  • id_crs
  • id_cpy_crs
  • id_evt_crs

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

如何选择:

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

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

1 个答案:

答案 0 :(得分:1)

  
      
  1. 事件A涉及的所有公司(所有属性)
  2.   

在不知道您的数据的情况下,我会寻求更安全的方法来避免潜在的重复:具有相关子查询的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. 所有参与事件A和事件B的公司
  2.   

您可以添加其他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. 所有参与事件A或事件B的公司
  2.   

将事件名称的相等条件更改为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. 所有未参与任何活动的公司
  2.   

因为我们不需要加入事件表,所以这简化了子查询。

SELECT c.*
FROM company c
WHERE NOT EXISTS (
    SELECT 1
    FROM company_event ce
    WHERE ce.id_cpy_crs = c.id_cpy
)