明确一点,我想避免在我的node.js程序中出现for循环
我当前的方法是一个group_concat()查询[工作正常]
SELECT DISTINCT(c.main), GROUP_CONCAT(c.cId) AS cId_List FROM customers c LEFT JOIN boxes b ON b.boxId = c.boxId WHERE c.opId = ? GROUP BY c.conNo ORDER BY c.conNo ASC;
//response to json
{
"main": 2,
"cId_List": "512,513"
},{
"main": 3,
"cId_List": "514,515,516,517"
},....
我需要运行的下一个查询是针对每个“ cId_List”的
for(every cId_List){
qry = "SELECT SUM(amount) FROM payments p WHERE p.cId IN (cId_List);"
}
我该如何避免呢?
避免出现这种情况的原因是,对no.queue的查询没有限制。单个请求可以为10000+。
新增资讯
怎么了?
有两个表,即客户,付款通过执行组concat
,客户表中可以有多个行具有相同的“连接号[main]”
我
现在要为每个要运行SUM的cId_List将这些行的ID放入cId_List中()在付款表中查询,
因此我的结果应为
{
"main": 2,
"cId_List": "512,513", //multiple rows of customers table
"amount_sum": 500 //data from payments table using above cId_List
},{
"main": 3,
"cId_List": "514,515,516,517",
"amount_sum": -200
},....
询问:sqlfiddle解释
customers.conNo是多个客户(基本上是一个家庭,他们一起计费)的
客户的统一列。cId是主键和分隔符(当我们需要按人计费时)
payments.cId是customers.cId的外键,并根据cid输入付款
需要根据conNo生成报告
因此,要获取conNo的所有付款,我需要将所有适当的cId发送到付款表。
我希望这将消除疑虑。
编辑:
我正在检查此查询,这可能是答案,我想知道此查询格式是否是良好的性能明智的选择?
SELECT GROUP_CONCAT(DISTINCT(customers.cId)) AS cId_List, customers.*, payments.cId, SUM(amount) AS amt FROM `payments` left join customers on customers.cId = payments.cId GROUP BY `customers`.`conNo` ORDER BY `customers`.`conNo` ASC
因此,您似乎可以简单地将所有代码替换为以下代码:
SELECT c.conno
, SUM(p.amount) total
FROM customers c
LEFT
JOIN payments p
ON p.cid = c.cid
GROUP
BY c.conno
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句