有没有办法在 HAVING 中包含双重条件?
Is there a way to include double condition in HAVING?
我目前正在处理如下所示的查询。有两个 tables - members
和 member_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,其中一个成员活跃时间超过一年。活跃意味着 "visited" 和 "joined" 列(均为 TIMESTAMP
)超过一年(我将其设置为 365 天)。
然而,在 运行 之后,此代码显示成员 table 中的所有行(尽管手动检查两个 table 显示某些行不满足两个条件同时)。
关于如何改进上面的代码有什么想法吗?我不确定我是否可以在 COUNT()
中使用 'nested' 条件,但之前使用的所有其他变体显示 NULL
值或返回 table 中的所有行,这是显然不对。另外,我在想问题可能出在 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。
你可以用这种方式
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 的计数差异类别使用分隔表达式,这些计数对非空值有效,因此如果您想获得真实值的总数,您应该起诉 SUM
我相信你首先需要找到 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
)
我目前正在处理如下所示的查询。有两个 tables - members
和 member_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,其中一个成员活跃时间超过一年。活跃意味着 "visited" 和 "joined" 列(均为 TIMESTAMP
)超过一年(我将其设置为 365 天)。
然而,在 运行 之后,此代码显示成员 table 中的所有行(尽管手动检查两个 table 显示某些行不满足两个条件同时)。
关于如何改进上面的代码有什么想法吗?我不确定我是否可以在 COUNT()
中使用 'nested' 条件,但之前使用的所有其他变体显示 NULL
值或返回 table 中的所有行,这是显然不对。另外,我在想问题可能出在 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。
你可以用这种方式
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 的计数差异类别使用分隔表达式,这些计数对非空值有效,因此如果您想获得真实值的总数,您应该起诉 SUM
我相信你首先需要找到 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
)