0

次の2つのテーブルシナリオがあります。

users
id   groups
1    1,2,3
2    2,3
3    1,3
4    3

groups
id
1
2
3

たとえば、グループ2と1に属するすべてのユーザーのIDを返すにはどうすればよいですか?join、helper group_membershipテーブル、またはカンマ区切りのグループIDを区切る関数を調べて、次のようなものを取得する必要があります。

group_membership
user_id   group_id
1         1
1         2
1         3
2         2
2         3
...       ...
4

4 に答える 4

1

ユーザーとグループの間には多対多の関係が必要です(つまり、ユーザーは複数のグループに属している可能性があり、グループは複数のユーザーを保持できます)。

あなたは3つのテーブルを持つことによってそれを行います:

  • ユーザー-ユーザー情報を説明します。
  • groups-グループ情報を説明します。
  • user_groups-どのユーザーがどのグループに属しているかを記述します。

user_groupsには、 user_idgroup_idの2つの列のみが必要です。各行は、単一のグループに属する単一のユーザーであり、両側での繰り返しが許可されます。

あなたの例は次のように解釈されます:

user_id   group_id
1         1
1         2
1         3
2         2
2         3
3         1
3         3
4         3

そうすれば、特定のグループのすべてのユーザーと、ユーザーがいるすべてのグループにクエリを実行するのは非常に簡単です。

このプロセスは、データベースの正規化とも呼ばれます

于 2012-09-30T20:14:04.247 に答える
0

問題に対する考えられる解決策は、データを再配置することです。

このためには、3つのテーブルが必要です。ユーザー、グループ、および「リンク」テーブル。

ユーザー:

user_id
userdata1

グループ:

group_id
groupdata1

リンク

user_id
group_id

リンクリストでは、接続ごとに1つのデータセットを作成します。

したがって、ユーザー1がグループ2と3に属している場合、リンクテーブルにはuser_id1の2つのエントリがあります。1つはgroup_id2にリンクし、もう1つはgroup_id3にリンクします。

例に戻ると、グループ2からすべてのユーザーを取得するためのクエリは次のとおりです。

SELECT * FROM users, link WHERE link.user_id = users.user_id AND (group_id = 2 OR group_id = 3);

これにより、グループの1つに含まれるすべてのユーザーが、一部は重複として出力されます(両方のグループのメンバーであるユーザー)。重複を避けたい場合は、「GROUPBYuser_id」を追加してください

于 2012-09-30T20:10:13.617 に答える
0

適切な正規化、唯一の使用可能なハック、およびそれがハックであることを除いて、この状況では、でハックを使用していLIKEます。

これはまだ遅くて恐ろしい習慣です。

SQL:

SELECT id FROM users 
WHERE 
   groups LIKE '%,$group_id,%' 
   OR groups LIKE '%,$group_id' 
   OR groups LIKE '$group_id,%'
于 2012-09-30T20:30:09.273 に答える
0

FIND_IN_SET()MySQL関数を使用できます。

于 2012-10-02T03:36:08.893 に答える