要清楚我想在我的node.js程序中避免循环
我当前的方法是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.queries没有限制。单次请求可以超过10000+。
添加了信息
发生了什么事?
有两个表,即客户,付款
客户表中可以有多行具有相同的"连接号[main]"
通过组concat,我将这些行的id输入cId_List
现在对于每个cId_List,我想在支付表中运行SUM()查询
所以我的结果应该是
{
"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是多个客户的统一列(基本上是一个家庭,他们一起收费)
customers.cId是主键和分隔因子(当我们需要按人数计费时)
payments.cId是customers.cId的外键,按照cId
输入付款报告需要根据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
答案 0 :(得分:1)
SELECT SUM(p.amount)
FROM customers AS c
LEFT JOIN payments AS p ON p.cid = c.cid
GROUP BY c.cid
答案 1 :(得分:1)
因此,您似乎只需使用以下代码替换所有代码:
SELECT c.conno
, SUM(p.amount) total
FROM customers c
LEFT
JOIN payments p
ON p.cid = c.cid
GROUP
BY c.conno
答案 2 :(得分:-1)
此查询似乎有效。任何人都可以告诉我它是否适当的表现。
如果有的话,也希望你的建议。感谢@Strawberry和@Luca Giardina
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