[英]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')
您还应该更改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.