我正在尝试在查询中创建一些计数,我的代码会反复重新计算总和。是否有更好的写作方式?
if(
(
(
select count(`t2`.`id`)
from `qbinvoices` `t2`
where `t2`.`qbAccNumber` = `t1`.`qbAccNumber`
and `t2`.`divisionId` = `t1`.`divisionId`
) > 0
),
(
select count(`t2`.`id`)
from `qbinvoices_view` `t2`
where `t2`.`qbAccNumber` = `t1`.`qbAccNumber`
and `t2`.`monthStart` > 0
and `t2`.`divisionId` = `t1`.`divisionId`
),
(
select count(`t2`.`id`)
from `qbestimatesnew_view` `t2`
where `t2`.`qbAccNumber` = `t1`.`qbAccNumber`
and `t2`.`divisionId` = `t1`.`divisionId`
)
) AS `invoiceItemsCount`
我正在使用它:
select count(`t2`.`id`)
from `qbinvoices` `t2`
where `t2`.`qbAccNumber` = `t1`.`qbAccNumber`
and `t2`.`divisionId` = `t1`.`divisionId`
在If
语句中。即:if(mystatement > 0, mystatement, differentVersionOfMyStatement)
我也在视图中使用它,所以我不能使用变量。是否有任何方法可以在If
语句中重复计数三次?
答案 0 :(得分:2)
我将这个逻辑表达为:
(case when exists (select 1
from `qbinvoices` `t2`
where `t2`.`qbAccNumber` = `t1`.`qbAccNumber` and
`t2`.`divisionId` = `t1`.`divisionId`
)
then (select count(`t2`.`id`)
from `qbinvoices_view` `t2`
where `t2`.`qbAccNumber` = `t1`.`qbAccNumber` and
`t2`.`monthStart` > 0 and
`t2`.`divisionId` = `t1`.`divisionId`
)
else (select count(`t2`.`id`)
from `qbestimatesnew_view` `t2`
where `t2`.`qbAccNumber` = `t1`.`qbAccNumber` and
`t2`.`divisionId` = `t1`.`divisionId`
)
end) AS `invoiceItemsCount`
count()
是用于确定是否存在记录的昂贵操作。 exists
具有停在第一个匹配记录的优势。
其他两个计数来自不同的表格。
另外,我更喜欢case
数据特定语法,例如if()
。
答案 1 :(得分:1)
不,因为代码不重复相同的计数。每个现有计数都会查看不同的数据源(qbinvoices
vs qbinvoices_view
vs qbestimatesnew_view
),但结果可能不同,因此必须在sql代码中使用所有数据。
您可以做的是将JOIN
与条件聚合结合使用,以便在SELECT
子句中更容易表达并且执行速度更快的方式进行汇总计划。但我们需要查看整个SQL查询,以向您展示更多内容。