有没有办法在HAVING中包含双重条件?

时间:2019-11-12 11:54:04

标签: mysql sql group-by mysql-error-1064

我目前正在处理类似这样的查询。有两个表-membersmember_gathering

SELECT id, city_id, name FROM members
WHERE "id" = "member_id" IN
(
   SELECT "member_id" from member_gathering
   GROUP BY "member_id"
   HAVING COUNT(DATEDIFF("visited","joined">=365))>=5
   ORDER BY "member_id"
)

ORDER BY id*1;

目标是输出满足 5个以上组的条件的所有ID,其中成员活跃超过一年。处于活动状态意味着“已访问”列和“已加入”列(均为TIMESTAMP)之间的差异已超过一年(我将其设置为365天)。

但是,运行后,此代码显示了成员表中的所有行(尽管手动检查两个表都显示某些行不能同时满足两个条件)。

关于如何改进上面代码的任何想法?我不确定是否可以在COUNT()中使用“嵌套”条件,但是之前使用的所有其他变体都显示NULL值或返回表中的所有行,这显然是不正确的。另外,我还认为问题可能出在DATEDIFF函数上。

欢迎所有建议:我是MySQL的新手,所以我不太熟悉它。

UPD:数据样本: 1)成员

id     city_id    name
2      980        Joey
5      980        Carl
10     1009       Louis
130    1092       Andrea

2)member_gathering

member_id      gathering_id     joined            visited    
2              1             2010-01-01 00:00:00  2010-02-01 00:00:00
2              2             2010-01-01 00:00:00  2010-02-01 00:00:00
5              2             2010-01-01 00:00:00  2010-02-01 00:00:00
10             3             2010-01-01 00:00:00  2010-02-01 00:00:00
130            1             2010-02-01 00:00:00  2013-02-01 00:00:00
130            2             2010-02-01 00:00:00  2013-02-01 00:00:00
130            3             2010-02-01 00:00:00  2014-02-01 00:00:00
130            4             2010-02-01 00:00:00  2018-02-01 00:00:00
130            5             2010-02-01 00:00:00  2015-02-01 00:00:00

预期结果仅为ID 130,因此:130、1092和Andreana。

2 个答案:

答案 0 :(得分:1)

您可以使用这种方式

SELECT id, city_id, name FROM members
WHERE member_id   IN
(
 SELECT member_id from member_gathering
 GROUP BY member_id
 HAVING SUM(DATEDIFF(visited, joined) >= 365)>=5
 ORDER BY member_id
)

对于datediff和remmeber的count differente类别,您应该使用单独的表达式,因为countdiff对于非null值进行计数,因此,如果要获取真实值的总数,应该起诉SUM

答案 1 :(得分:1)

我相信您首先需要找到datediff为365天或更长时间的所有记录。然后找到具有5个或更多此类实例的成员。这需要WHERE和HAVING子句:

SELECT id, city_id, name
FROM members
WHERE id IN (
    SELECT member_id
    FROM member_gathering
    WHERE DATEDIFF(visited, joined) >= 365
    GROUP BY member_id
    HAVING COUNT(*) >= 5
)