我试图基本上解决以下问题:
1)查找系统中只有programID 1的所有用户。
2)查找系统中具有programID 1和任何其他活动程序的所有用户。
我的表结构(用非常简单的术语表示如下):
userID | Name
================
1 | John Smith
2 | Lewis Black
3 | Mickey Mantle
4 | Babe Ruth
5 | Tommy Bahama
ID | userID | plan | status
---------------------------
1 | 1 | 1 | 1
2 | 1 | 2 | 1
3 | 1 | 3 | 1
4 | 2 | 1 | 1
5 | 2 | 3 | 1
6 | 3 | 1 | 0
7 | 3 | 2 | 1
8 | 3 | 3 | 1
9 | 3 | 4 | 1
10 | 4 | 2 | 1
11 | 4 | 4 | 1
12 | 5 | 1 | 1
我知道我可以轻松找到具有以下内容的具体计划的所有成员:
SELECT * FROM users a JOIN plans b ON (a.userID = b.userID) WHERE b.plan = 1 AND b.status = 1
但这只会告诉我哪些用户有“有效”计划1.
如何判断谁只有计划1(在这种情况下只有用户ID 5)以及如何判断谁有计划1以及任何其他有效计划?
更新:这不是为了计算,我实际上需要原始成员信息,包括他们拥有的所有计划,因此COUNT(*)响应可能不是我想要实现的。
答案 0 :(得分:0)
Okey ...,您已经提到您不希望计算特定用户持有的其他计划,但根据您的要求,您可以获得最佳输出,例如,
这很多用户计划1活跃,这是他计划的其他活动计划的计数。
SELECT u.userID,
u.Name,
p.Id AS Plan1ActiveId,
(SELECT COUNT(*) FROM plans sub where sub.userID = u.userID and sub.plan <> 1 and sub.status = 1) AS OtherActivePlanCount
FROM users u JOIN plans p ON (u.userID = p.userID)
where p.plan = 1 AND p.status = 1;
或者如果您想深入了解计划的详细信息,则需要应用第二个查询,为您提供其他计划的详细信息。
答案 1 :(得分:0)
你可以使用COUNT结合GROUP BY和HAVING子句。
例如:
SELECT * FROM users a JOIN plans b ON (a.userID = b.userID) GROUP BY b.user_ID HAVING COUNT(*) = 1 AND b.plan = 1
这将按用户ID对行进行分组,并且只包含count = 1的行(计划表中只有1行)
答案 2 :(得分:-1)
注意 - 我最终简化了整体概念。我只是对所有成员进行了一个子选择,我知道他有我想要的目标。然后,我对所有计划进行了全面选择,这些成员要么具有IN或不在已知ID的子选择中的ID。
经过测试,这比资源更少,使用起来比建议更容易,但感谢您的帮助。