我正在努力使用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()
但看不到如何包含它。
答案 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_id
和oppreg
。如果没有,那么我们将不得不进行额外的联接以引入这些额外的信息。
关于查询的解释,它通过尝试将每个oppreg_id
组缩减为仅具有两个指定的activity_id
值的那些记录而起作用。然后,它使用COUNT
进行汇总并断言存在两个截然不同的activity_id
,如果为true,则表示该oppreg_id
组是一个匹配项。
答案 1 :(得分:1)
我认为您需要在哪里过滤日期,在True
处进行多次输入检查
count