2012-03-30 3 views
0

を使用して多対多の関係を持つ2つのテーブルからデータを表示する - 最初のものは、ユーザーと呼ばれるフィールドがあります。は、私は2つのテーブル間の単純な接続を作っていますPHP/CodeIgniterの

を|| id ||名前||

とグループと呼ばれる第二のテーブルは、同じフィールドを有する:

|| id ||名前||

1人のユーザーが多数のグループに参加することができ、グループには複数のユーザーが含まれているため、これらの関係は多岐にわたります。だから私は3番目のテーブルuser_groupフィールドを持っています:

|| user_id || group_id ||

ここで、両方ともユーザ用であり、1つはグループ用のforegin鍵です。

目標は、すべてのグループとそれぞれのグループに参加しているリストを作成することです。私は私のクエリを作っこのため :

$q = $this->db->query('SELECT u.name FROM users u 
JOIN user_group ug ON u.id = ug.user_id 
JOIN groups g ON g.id = ug.group_id WHERE ug.group_id = "4" '); 

、その後は、アクティブなレコードを使用して、それを修正:

$this->db->select('users.name'); 
$this->db->from('users'); 
$this->db->join('user_group', 'user_group.user_id = users.id'); 
$this->db->join('groups', 'groups.id = user_group.group_id'); 
$this->db->where('user_group.group_id', 3); 
$q = $this->db->get(); 

そして、私はグループテーブルから「ID」与えられたことによって、任意のグループのユーザーを取ることができ、このよう。しかし、私が理解できないことは、参加するユーザーとグループの名前の両方を表示する方法です。私がテーブルを作成して削除すると、idが非常に不調になり、20のグループがあり、いくつかのグループにid = 53があるので、1からnumber_of_groupsまでのループは十分ではありません。これを行う方法は何ですか?

おかげ Leron

+0

クエリ結果から直接グループ名/ユーザー名にアクセスできるように、テーブルの1つ(またはその両方)の 'name'列のエイリアスを設定することをお勧めします。 http://www.w3schools.com/sql/sql_alias.aspを参照してください。 – rjz

+0

エイリアスがここでの主な問題ではないと思います。あなたは私のfirsのクエリを見ることができます - それはエイリアスがありますが、私が望む情報を表示するのに役立つ方法を見ていません。 – Leron

答えて

1

あなたはグループだけでなく、すべて1で、そのグループ内のユーザーを取得することはできませんクエリ。あなたは、グループ内のユーザーがユーザーのために複数の行が返されますので、ユーザは、多くの関係に多くのです=>グループ

SELECT g.group_name, GROUP_CONCAT(u.fullname) 
FROM group g 
JOIN user_group ug ON g.id = ug.id 
JOIN user u ON ug.user_id = u.id 
GROUP BY g.id 

1つのクエリで、グループごとに連結されたユーザのリストを得ることができます。

連結したフォームではなくユーザーの詳細のリストが必要な場合は、 グループリストを反復処理し、usersにキーを追加できます。

$group
$groups = $this->db->get('groups')->result(); 

foreach($group as &$g){ 
    $this->db->select('users.name'); 
    $this->db->from('users'); 
    $this->db->join('user_group', 'user_group.user_id = users.id'); 
    $this->db->where('user_group.group_id', $g->id); 
    $g->users = $this->db->get()->result(); 
} 

今、あなたのループと& foreachループで$gの前にいること$group->users

お知らせをユーザーにアクセスすることができます。 foreachは渡される変数のコピーを操作するので、その参照を渡します。

1

あまりにもグループ名を選択し、あなただけのフィールド名をエイリアスする必要があります。

$q = $this->db->query('SELECT u.name, g.name AS `group_name` FROM users u 
JOIN user_group ug ON u.id = ug.user_id 
JOIN groups g ON g.id = ug.group_id WHERE ug.group_id = "4" '); 
+0

はい、このように動作します。 Althoug私は正確にidを望んでいません - グループのIDをどうにかしてループさせるか、WHERE句を削除するようにすべてのグループを欲しいですが、すべての結果を得て、これをフィルタリングするのが難しくなると思います。 – Leron

+0

私はあなたが何を求めているのか正確には分かりません。そのグループに所属するユーザーの数をカウントするだけで各グループが必要ですか? –

+0

いいえカウントがはるかに簡単になるでしょう、実際の人生の例ですので、想像することができます。各グループの名前 - カウントだけではなく、参加している人々のリスト。私はそれが何らかのフィルタリングを必要とするSQLでのみ行うことはできませんが、正確にそれを行う場所を把握することはできません。 – Leron

関連する問題