Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用codeigniter查询获得每个产品的平均评级?_Php_Mysql_Codeigniter_Average - Fatal编程技术网

Php 如何使用codeigniter查询获得每个产品的平均评级?

Php 如何使用codeigniter查询获得每个产品的平均评级?,php,mysql,codeigniter,average,Php,Mysql,Codeigniter,Average,我有一个评级表,其中有用户给出的每个产品的评级,我正在检索所有评级记录,但同时我想根据每个产品获得平均评级,但我无法获得输出 查询: $this->db->select('ratings.*'); $this->db->select('select AVG(ratings) as avg_rating from ratings group by product_id'); $this->db->from('ratings'); $this->db->

我有一个评级表,其中有用户给出的每个产品的评级,我正在检索所有评级记录,但同时我想根据每个产品获得平均评级,但我无法获得输出

查询:

$this->db->select('ratings.*');
$this->db->select('select AVG(ratings) as avg_rating from ratings group by product_id');
$this->db->from('ratings');
$this->db->join('users','users.id=ratings.user_id');
$this->db->get()->result();
评级表

id   user_id product_id  rating  

1      4         1         4
 
2      5         2         4

3      6         1         2


4      7         4         4
预期产出:

id   user_id product_id  rating          avg rating

1      4         1         4               3
 
2      5         2         4               4

3      6         1         2               3


4      7         4         4               4

当查询变得复杂时,我喜欢使用查询而不是查询生成器。您可以这样做:

$this->db->query('select r.*,(select round(sum(r2.rating)/count(*),0) from ratings r2 where r2.product_id = r.product_id ) as 'avg rating' from ratings r')->result();

从表ratings中获取数据,使用带select的左连接作为平均值

Codeigniter的名称允许您编写一个select部分,而不是表名,但您需要将其放在括号中:

$this->db->select('t1.*, t2.avg_rating, t3.*');
$this->db->from('ratings t1');
$this->db->join('
                  (select product_id, avg(rating) as avg_rating 
                   from ratings 
                   group by product_id)  t2','t2.product_id=t1.product_id','left'
                );
$this->db->join('users t3','t3.id=t1.user_id','left'); 
$this->group_by('t1.userid')
$this->db->get()->result();
生成:

SELECT t1.*, t2.avg_rating, t3.*
FROM ratings t1
left join 
        (select product_id, avg(rating) as avg_rating from ratings group by product_id)  t2 
    on t2.product_id=t1.product_id
left join users t3
    on t1.user_id = t3.id
group by t1.user_id

和您期望的输出。

但用户的联接表在哪里,我必须显示用户名,因此我也要联接用户表。为了简短的示例,我想将第二个联接从示例中删除,但是同时更新了帖子如果从连接部分计算括号,我会得到括号错误,它只有5个。非常感谢,我添加了你的查询,它工作得非常好。连接用户表的连接查询在哪里,我不能错过它的重要性