2016-11-20 16 views
0

私は人々のためのテーブルと、参加可能なグループのテーブルを持っています。複数の人が同じグループに属していることは明らかです.1人は複数のグループに属している可能性があります。私はこの問題を解決するために、MySQLやSQLデータベースを使ってこれを行う方法を理解することができません。私には解決策がありますが、それが一般的に行われているのかどうかはわかりません。複数のグループの複数のユーザーSQL

私が試みたのは、person_idとgroup_idの列で構成されるメンバシップと呼ばれる3番目のテーブルでした。だから、実際にはそれは順序付けされたペアのためのテーブルです。

名前とプライマリキーのグループ、名前とプライマリキーのグループ、プライマリキーとグループのプライマリキーのメンバーシップがあります。そうすれば、同じ人物のプライマリキーを複数のグループに分けて複数のグループに分けることができます。

は、その後、特定のグループのすべてのメンバーを一覧表示するには、私はこのクエリ行うだろう:人が所属するすべてのグループを一覧表示するには

SELECT DISTINCT users.name AS 'Members of Group 2' 
FROM users, memberships, groups 
WHERE users.user_id = memberships.user_id 
AND memberships.group_id = 2; 

を、私はこのクエリを実行します。

SELECT DISTINCT groups.name AS 'Groups of User 3' 
FROM groups, memberships, users 
WHERE groups.group_id = memberships.group_id 
AND memberships.user_id = 3; 

distinctコマンドを使用する必要があります。そうでなければ、グループの総数に等しい回数だけリストを出力します。だから私は5つのグループがあり、特定のグループの人々のリストが必要な場合、同じリストを5回印刷します。なぜそれがそれをするのか分からない。しかし、私は「DISTINCT」という言葉を投げかけてから働きました。

それは機能的ですが、それはうっすらで、それが通常行われている方法かどうかわかりません。どのように人々は通常それを行うのですか?

+0

通常、20th cで一般的な暗黙の(カンマ)結合の代わりに明示的な結合を使用します。 – Strawberry

+0

@Strawberryコードでどのように見えるでしょうか? – Cordello

+0

@Cordello - Googleの検索で、その質問に喜んで答えることができます。 – Parfait

答えて

0

は、FROM句のカンマを使用します。 常には、明示的なJOIN構文を使用します。あなたの質問は:

SELECT u.name as Group2Member 
FROM users u JOIN 
    memberships m 
    ON u.user_id = m.user_id 
WHERE m.group_id = 2; 

注:groupsテーブルは必要ありません。グループメンバーの

はである:

SELECT g.name as User3Group 
FROM memberships m join 
    groups g 
    ON g.group_id = m.group_id 
WHERE m.user_id = 3; 

あなたが使用してはならないし、どちらかのクエリのDISTINCTは必要ありません。それは単に計算資源の無駄です。

+0

私はあなたの答えが好きです、私はちょうど確信したい:3番目のテーブル、メンバーシップテーブル、良い練習を使用している? – Cordello

+0

@Cordello。 。 。これは、ユーザーをグループに結び付ける表です。あなたは選択肢がありません:それはキーテーブルです。 –