MySQL的:通过关联选择

问题描述 投票:0回答:1

我有以下MySQL表:

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

  • id_cpy(INT)
  • name_cpy(VARCHAR)
  • xxx_cpy(更多公司属性)

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

  • id_evt(你)
  • 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. 未参与任何活动的所有公司

非常感谢你的帮助!汉纳斯

mysql sql select associations
1个回答
1
投票
  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
)
  1. 中涉及的事件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
)
  1. 中涉及的事件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
)
  1. 未参与任何活动的所有公司

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

SELECT c.*
FROM company c
WHERE NOT EXISTS (
    SELECT 1
    FROM company_event ce
    WHERE ce.id_cpy_crs = c.id_cpy
)
© www.soinside.com 2019 - 2024. All rights reserved.