Php 无法合并三条select语句的结果

Php 无法合并三条select语句的结果,php,mysql,sql,group-by,pivot,Php,Mysql,Sql,Group By,Pivot,嘿,看这里,我试图从这三个select语句中同时得到结果,但我无法做到这一点。所以请帮我改正我的错误。如果你发现我的英语或提问方法不好,不要给我负面评价 $sql = $conn->prepare("SELECT Count(c.c_id) from complaints c, users u,cell_num cn where c.status=? AND c.u_id_fk=u.u_id AND u.u_id=cn.u_id_fk"); $sql->bind_param("i

嘿,看这里,我试图从这三个select语句中同时得到结果,但我无法做到这一点。所以请帮我改正我的错误。如果你发现我的英语或提问方法不好,不要给我负面评价

 $sql = $conn->prepare("SELECT Count(c.c_id) from complaints c, users u,cell_num cn where c.status=? AND c.u_id_fk=u.u_id AND u.u_id=cn.u_id_fk");
 $sql->bind_param("i",$statOpen);

 $sql .= $conn->prepare("SELECT Count(c.c_id) from complaints c, users u,cell_num cn where c.status=? AND c.u_id_fk=u.u_id AND u.u_id=cn.u_id_fk");
 sql->bind_param("i",$statProgress);

 $sql .= $conn->prepare("SELECT Count(c.c_id) from complaints c, users u,cell_num cn where c.status=? AND c.u_id_fk=u.u_id AND u.u_id=cn.u_id_fk");
 $sql->bind_param("i",$statClosed);

                        $sql->execute();

                        $sql->store_result();

                        if($sql->num_rows > 0)
                        {
                            $sql->bind_result($c_id);

                            while( $sql->fetch() )
                            {
                                $user[] = array(
                               'c_id'=>$c_id


                             );
                            }
                            echo json_encode($user);


                            $sql->close();
                        }

您可以执行条件聚合:

select 
    sum(c.status = ?) cnt_open,
    sum(c.status = ?) cnt_progress,
    sum(c.status = ?) cnt_closed
from complaints c
inner join users u on u.u_id = c.u_id_fk
inner join cell_num cn on cn.u_id_fk = u.u_id
此查询同时接受三个参数,它们对应于传递给三个单独查询的三个值

请注意,我修改了查询以使用标准联接(带有
on
关键字),而不是老式的隐式联接(在
from
子句中带有逗号):这种古老的语法不应该在新代码中使用

您可以通过添加一个
where
子句来提高查询效率,该子句对三个可能的
状态进行过滤(这需要将每个参数传递两次):


您可以执行条件聚合:

select 
    sum(c.status = ?) cnt_open,
    sum(c.status = ?) cnt_progress,
    sum(c.status = ?) cnt_closed
from complaints c
inner join users u on u.u_id = c.u_id_fk
inner join cell_num cn on cn.u_id_fk = u.u_id
此查询同时接受三个参数,它们对应于传递给三个单独查询的三个值

请注意,我修改了查询以使用标准联接(带有
on
关键字),而不是老式的隐式联接(在
from
子句中带有逗号):这种古老的语法不应该在新代码中使用

您可以通过添加一个
where
子句来提高查询效率,该子句对三个可能的
状态进行过滤(这需要将每个参数传递两次):


你可以这样做,它更优化

select c.statut,count(c.c_id)
from complaints c
inner join users u on u.u_id = c.u_id_fk
inner join cell_num cn on cn.u_id_fk = u.u_id
where c.status in (?, ?, ?)
group by c.status

你可以这样做,它更优化

select c.statut,count(c.c_id)
from complaints c
inner join users u on u.u_id = c.u_id_fk
inner join cell_num cn on cn.u_id_fk = u.u_id
where c.status in (?, ?, ?)
group by c.status

@贝尔:是的;实际上,
sum(c.status=?)
是一个MySQL的快捷方式,用于
sum(c.status=?然后1 else 0 end)
。我在postgresql上尝试了它,但它不起作用,postgresql不支持这个快捷方式。@M.a.Bell:事实上,这是MySQL特有的(你用它标记了你的问题)。在Postgres中,您可以使用
sum(case…
解决方案,或者使用
count(*)过滤器(其中c.status=?)
@GMB这不是我的问题,谢谢您提供有关PostgreSql的信息实际上我必须根据不同的status值计算c_id,status有三个值0、1、2。我想输出有多少个c_id的状态为0,有多少个c_id的状态为1,还有多少个c_id的状态为02@M.A.Bell:是;实际上,
sum(c.status=?)
是一个MySQL的快捷方式,用于
sum(c.status=?然后1 else 0 end)
。我在postgresql上尝试了它,但它不起作用,postgresql不支持这个快捷方式。@M.a.Bell:事实上,这是MySQL特有的(你用它标记了你的问题)。在Postgres中,您可以使用
sum(case…
解决方案,或者使用
count(*)过滤器(其中c.status=?)
@GMB这不是我的问题,谢谢您提供有关PostgreSql的信息实际上我必须根据不同的status值计算c_id,status有三个值0、1、2。我想输出状态为0的c_id有多少,状态为1的c_id有多少,状态为2的c_id有多少