0

我试图从根本上解决以下问题:

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(*) 响应可能不是我想要实现的。

4

3 回答 3

0

好的...,您已经提到您不希望计算特定用户持有的其他计划,但根据您的要求,您可以获得最佳输出,例如,

这么多用户的计划 1 处于活动状态,这是他除计划 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;

或者,如果您想深入了解计划的详细信息,则需要应用第二个查询来为您带来其他计划的详细信息。

于 2012-10-01T18:26:37.117 回答
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 对行进行分组,并且仅包括计数 = 1 的行(计划表中只有 1 行)

于 2012-10-01T18:27:12.237 回答
-1

注意 - 我最终简化了我脑海中的整体概念。我只是对我知道的所有成员进行了子选择,这些成员有我正在寻找的目标。然后,我对所有计划的成员进行了总体选择,这些成员的 ID 在或不在已知 ID 的子选择中)。

经过测试,这比建议更容易使用资源,但感谢您的帮助。

于 2012-10-09T21:35:46.263 回答