0

table1 と table2 の 2 つのテーブルがあり、table1 にはユーザーの詳細を保存し、table2 には同じ table1.id と rating 列の評価を持つ複数の行である評価を保存していますが、次のコードを実行すると 1 つだけが返されます特定のユーザーではなく、すべての評価の行と平均。私はクエリが少し苦手です。 Select 内に Select が必要だと思いますが、それは CodeIgniter であるため、それを行うことはできません。助けてください

 $this->db->select('table1.id,table1.name, table1.email, AVG(table2.rating)');
            $this->db->from('table1');
            $this->db->join('table2', 'table1.id = table2.review_id', 'inner');
            $this->db->where(array('table1.status' => 1, 'table1.b_id' => $bid));
            $query = $this->db->get();
            return $query;

私が欲しいのは:

> id Name  email            AvG
> 
> 1  name1 name1@xyz.com  average of ratings by this id in table2 
> 2  name2 name2@xyz.com  average of ratings by this id in table2

しかし、私が得ているのは

> id  Name email           AvG
> 
> 1  name1 name1@xyz.com  average of all ratings in table2
4

1 に答える 1

1

あなたが必要GROUP BY

$this->db->select('table1.id, table1.name, table1.email, AVG(table2.rating)');
$this->db->from('table1');
$this->db->join('table2', 'table1.id = table2.review_id', 'inner');
$this->db->where(array('table1.status' => 1, 'table1.b_id' => $bid));
$this->db->group_by(array('table1.id','table1.name', 'table1.email'));
$query = $this->db->get();
return $query;

更新sを考慮しないrating = 0という事実を使用できる場合に正しい平均を取得するには。したがって、選択部分でorを使用できますAVG()NULLIFNULL()CASE

$this->db->select('table1.id, table1.name, table1.email, AVG(NULLIF(table2.rating, 0))');

ベースSQLクエリは次のようになります

SELECT t1.id, t1.name, t1.email, AVG(NULLIF(t2.rating, 0)) rating
  FROM table1 t1 JOIN table2 t2
    ON t1.id = t2.review_id
 WHERE ...
 GROUP BY t1.id, t1.name, t1.email
于 2013-06-12T10:11:53.733 に答える