繁体   English   中英

在同一表上合并多个选择计数查询

[英]Combine Multiple Select Count Queries on same table

我有一张桌子,里面有一堆订单行。 我需要检查表以查看是否有1个或更多行匹配2个WHERE子句。 如果存在,我将在页面上其他地方使用的变量设置为“是”。

目前,我正在使用单个php mysql查询进行检查,但想知道是否有可能将它们组合为一个选择查询,因此我一次访问数据库而不是10次或更多次。

这是当前代码的示例:

$query9 = "SELECT COUNT(*) as num FROM mojave_requests where status = 'Pending' AND local = 'L-BKED'";
$requestEDI = mysql_fetch_array(mysql_query($query9));
$requestEDI = $requestEDI[num];
if ($requestEDI> 0) {
$requestsEDI = 'yes';
}

$query11 = "SELECT COUNT(*) as num FROM mojave_requests where status = 'Pending' AND local = 'LOQ53'";
$requestLOQ53 = mysql_fetch_array(mysql_query($query11));
$requestLOQ53 = $requestLOQ53[num];
if ($requestLOQ53 > 0) {
$requestsLOQ53 = 'yes';
}

$query13 = "SELECT COUNT(*) as num FROM mojave_requests where status = 'Pending' AND local = 'L-YRYR'";
$requestLYRYR = mysql_fetch_array(mysql_query($query13));
$requestLYRYR = $requestLYRYR[num];
if ($requestLYRYR > 0) {
$requestsLYRYR = 'yes';
}

$query15 = "SELECT COUNT(*) as num FROM mojave_requests where status = 'Pending' AND local = 'L-CAL0611'";
$requestLCAL0611 = mysql_fetch_array(mysql_query($query15));
$requestLCAL0611 = $requestLCAL0611[num];
if ($requestLCAL0611 > 0) {
$requestsLCAL0611 = 'yes';
}

每个查询之间唯一的两件事是我正在检查的“本地”列字符串和如果存在至少1个匹配项,则将变量名设置为“是”。

感谢您的光临。

您可以将条件和用作

SELECT 
sum
( 
  case when status = 'Pending' AND local = 'L-BKED' then 1 else 0 end 
) as `L-BKED_COUNT`,
sum
( 
  case when status = 'Pending' AND local = 'LOQ53' then 1 else 0 end 
) as `LOQ53_COUNT`,
sum
( 
  case when status = 'Pending' AND local = 'L-YRYR' then 1 else 0 end 
) as `L-YRYR_COUNT`,
sum
( 
  case when status = 'Pending' AND local = 'L-CAL0611' then 1 else 0 end 
) as `L-CAL0611_COUNT`
FROM mojave_requests 

GROUP BY SELECT将为您提供与所需值local匹配的count

SELECT   COUNT(*) as num, 
         local 
FROM     mojave_requests 
WHERE    status = 'Pending' 
GROUP BY local
HAVING   local IN ('L-BKED','LOQ53','L-YRYR','L-CAL0611')

SQL小提琴

您还应该更改PHP代码,不要使用那些$request___变量,而只能使用一段时间才能检查:

$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
    switch ($row[1]) {
      case 'L-BKED':
        code to be executed if count for L-BKED > 0
         break;
      case 'LOQ53':
        code to be executed if count for LOQ53 > 0
        break;
      case 'L-YRYR':
        code to be executed if count for L-YRYR> 0
        break;
      ...
    }
}

您正在寻找条件聚合。 在MySQL中执行此操作的最简单方法是利用以下事实:布尔值在数字上下文中被视为数字:

SELECT SUM(status = 'Pending' AND local = 'L-BKED') as num_bked,
       SUM(status = 'Pending' AND local = 'LOQ53') as num_loc53,
       SUM(status = 'Pending' AND local = 'L-YRYR') as num_yryr,
       SUM(status = 'Pending' AND local = 'L-CAL0611') as num_cal0611
FROM mojave_requests;

这将返回一行中的值。 您可以通过引用php中的列来获取值。

您可以通过排除第一个条件来简化此查询:

SELECT SUM(local = 'L-BKED') as num_bked,
       SUM(local = 'LOQ53') as num_loc53,
       SUM(local = 'L-YRYR') as num_yryr,
       SUM(local = 'L-CAL0611') as num_cal0611
FROM mojave_requests
WHERE status = 'Pending';

如果很少有状态值实际上是PENDING ,则mojave_requests(status, local)上的索引应显着提高性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM