在链接表中检索具有多个匹配项的记录

时间:2019-04-15 10:31:28

标签: mysql

我正在努力使用SQL,希望能提供一些帮助。

我在mySQL中有一个主表和一个一对多链接表,并由oppreg_id连接。我想检索主表上与链接表中的activity_id字段具有多个匹配项的所有记录。

main table            link table
oppreg                oppreg2activity
---------------       -----------------
oppreg_id   ---->     oppreg_id
title                 activity_id
description
end_date
...

所以我可能有

oppreg_id = 4563 in the main table

并记录在oppreg2activity表中

oppreg_id  activity_ID
  4563      27e17f2e
  4563      38d6bd73
  4563      ....

我尝试过SQL

SELECT oppreg.`oppreg_id`,`title`,`description`, activity_id 
FROM `oppreg` 
INNER JOIN oppreg2activity ON oppreg.oppreg_id = oppreg2activity.oppreg_id
GROUP BY `oppreg_id`
HAVING 
  activity_id = '27e17f2e' 
  AND activity_id = '38d6bd73'

此功能在存在一个WHERE项目但在多个WHERE项目失败的情况下起作用。

我还需要添加其他限制

oppreg.end_date >= CURDATE()

但看不到如何包含它。

2 个答案:

答案 0 :(得分:3)

您建议使用oppreg_id进行汇总是正确的,但是您应该在HAVING子句中声明计数,而不是使用简单的等式。

SELECT
    o.oppreg_id
FROM oppreg o
INNER JOIN oppreg2activity oa
    ON o.oppreg_id = oa.oppreg_id
WHERE
    oa.activity_id IN ('27e17f2e', '38d6bd73') AND
    o.end_date >= CURDATE()
GROUP BY
    o.oppreg_id
HAVING
    COUNT(DISTINCT activity_id) = 2;

请注意,只有当title列是description表中的主键时,才选择oppreg_idoppreg。如果没有,那么我们将不得不进行额外的联接以引入这些额外的信息。

关于查询的解释,它通过尝试将每个oppreg_id组缩减为仅具有两个指定的activity_id值的那些记录而起作用。然后,它使用COUNT进行汇总并断言存在两个截然不同的activity_id,如果为true,则表示该oppreg_id组是一个匹配项。

答案 1 :(得分:1)

我认为您需要在哪里过滤日期,在True处进行多次输入检查

count