0

私は本質的に次のことを解決しようとしています:

1)programID1のみを持つシステム内のすべてのユーザーを検索します。

2)programID1およびその他のアクティブなプログラムを持つシステム内のすべてのユーザーを検索します。

私のテーブル構造(非常に簡単な用語は次のとおりです):

ユーザー

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のみ(この場合はuserID 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;

または、プランの詳細にドリルダウンする場合は、他のプランの詳細を表示する2番目のクエリを適用する必要があります。

于 2012-10-01T18:26:37.117 に答える
0

COUNTをGROUPBYおよび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または含まれないIDを持つメンバーによるすべてのプランの全体的な選択を行いました。

テスト後、これは提案よりもはるかにリソースを消費せず、少し使いやすくなりましたが、助けに感謝します。

于 2012-10-09T21:35:46.263 に答える