【问题标题】:Not able to merge results from the three select statements无法合并三个 select 语句的结果
【发布时间】:2020-05-13 00:28:34
【问题描述】:

嘿,看这里,我试图一次从这三个 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();
                        }

【问题讨论】:

    标签: php mysql sql group-by pivot


    【解决方案1】:

    你可以做条件聚合:

    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 子句来过滤三个可能的statuses 来提高查询效率(这需要将每个参数传递两次):

    where c.status in (?, ?, ?)
    

    【讨论】:

    • @MABell:是的;实际上,sum(c.status = ?)sum(case when c.status = ? then 1 else 0 end) 的 MySQL 快捷方式。
    • 我在postgresql上试了一下还是不行,postgresql不支持这个快捷方式。
    • @M.A.Bell:确实,这是 MySQL 特有的(你用它来标记你的问题)。在 Postgres 中,可以使用sum(case ...) 解决方案,也可以使用count(*) filter(where c.status = ?)
    • @GMB 这不是我的问题,感谢您提供有关 postgresql 的信息
    • 实际上我必须根据不同的 status 值来计算 c_id , status 有三个值 0, 1, 2 。我想输出有多少 c_id 有状态 0,然后有多少 c_id 有状态 1,有多少有状态 2
    【解决方案2】:

    你可以这样做,它更优化

    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
    

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2021-12-08
      • 2012-05-19
      相关资源
      最近更新 更多