我可以使用查询的行结果来运行子查询并获取返回的数据吗?

时间:2015-11-13 15:05:29

标签: mysql node.js

要清楚我想在我的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

问: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

3 个答案:

答案 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

http://sqlfiddle.com/#!9/a65cf6/11

答案 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