使用用户子类别限制MySQL结果的最佳方法

时间:2012-10-01 17:45:06

标签: mysql

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

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

3 个答案:

答案 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。

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