【问题标题】:combine two tables and sum mysql合并两个表并对mysql求和
【发布时间】:2017-10-15 17:10:37
【问题描述】:

我想加入两个表,但我不能这样做,因为我想对列求和并得到两个日期之间的结果

第一个表名为:vip_allotment_details

allotment_id    qty
2                3
2                5
1                2
1                4

第二个表名:vip_allotment

id   date_from  date_to
1    2017-10-1  2017-10-5
2    2017-10-6  2017-10-10

我想从查询中得到这个结果

id    qty  date_from   date_to
1      6   2017-10-1   2017-10-5
2      8   2017-10-6   2017-10-10

我会解释结果:

第一个 allotment_id 字段与第二个表中的 id 字段链接,我希望我们可以通过 date_from 和 date_to 之间的两个字段(id , allotment_id )来计算 qty 的总和

这是我的尝试:

$query1 = "
SELECT SUM(qyt) as total
   FROM vip_allotment_details 
 where allotment_id IN ( SELECT id from vip_allotment where date_from >= '$date_1' AND date_to <= '$date_2') 
";

在我的查询中,结果得到所有 qty 字段的总和,没有过滤器..

我希望我已经很好地解释了我的问题。

谢谢/。

【问题讨论】:

    标签: php mysql sum


    【解决方案1】:

    我还没有尝试,但也许你可以这样尝试:

    SELECT a.id AS id, SUM(qyt) AS qty, date_from, date_to
    FROM vip_allotment AS a
    LEFT JOIN vip_allotment_details AS b on b.allotment_id = a.id
    WHERE a.date_from >= '{thedatestart}' AND a.date_to <= '{thedateend}'
    GROUP BY a.id
    ORDER BY a.id ASC;
    

    【讨论】:

    • 感谢它的工作,但我需要在其上设置日期范围,例如 date_from >= 'something' 和 date_to
    • 好的,只需在该查询上添加 WHERE 子句WHERE a.date_from &gt;= '{thedatestart}' AND a.date_to &lt;= '{thedateend}'
    【解决方案2】:

    您需要使用JOIN。我看到您正在使用 IN 关键字,这不起作用。有很多方法可以解决您的问题。其中之一是,

    select allotment_id, qty, date_from, date_to
    from 
    (select allotment_id, SUM(qty) as qty 
       from vip_allotment_details group by allotment_id
    ) at
    INNER JOIN 
    vip_allotment va 
    ON va.id= at.allotment_id;
    

    【讨论】:

      【解决方案3】:

      我认为以下内容应该满足您的要求。

      SELECT 
          va.id,
          SUM(vad.qyt) AS total,
          va.date_from,
          va.date_to
      FROM vip_allotment_details AS vad 
      LEFT JOIN vip_allotment AS va ON va.id = vad.allotment_id
      GROUP BY vad.allotment_id
      

      【讨论】:

        【解决方案4】:

        试试下面。我想你会得到你想要的结果。

        select va.id, temp.qty , va.date_from,va.date_to from vip_allotment as va
        inner join (select sum(qty) as qty , allotment_id from vip_allotment_details group by `allotment_id`) as temp
        ON temp.allotment_id=va.id 
        where va.date_from >= '$date_1' AND va.date_to <= '$date_2';
        

        【讨论】:

          【解决方案5】:

          如果您想要多个结果来自聚合函数(SUM、COUNT、AVG、...),您需要使用 GROUP BY。您的查询并不难,这应该可以解决问题:

          SELECT va.id, va.date_from, va.date_to, SUM(vad.qyt) AS qyt
          FROM vip_allotment AS va
          LEFT JOIN vip_allotment_details AS vad ON vad.allotment_id = va.id
          GROUP BY va.id
          

          正如您在此处看到的,这会产生预期的结果:http://sqlfiddle.com/#!9/707a8/2

          如果您现在想开始添加额外的过滤器(如按日期过滤),您只需在查询中添加WHERE 即可。像这样的:

          ...
          LEFT JOIN ...
          WHERE va.date_from >= "2017-10-06" and va.date_to <= "2018-10-06"
          GROUP BY ...
          

          http://sqlfiddle.com/#!9/707a8/6

          附带说明,我注意到您没有在代码的 php 部分中绑定您的参数。请注意,这可能会带来严重的安全问题,尤其是当这些日期直接来自用户输入时。我建议查看PDO 以在 PHP 中进行实际查询。

          【讨论】:

          • 我真的很感激它,谢谢它,但我想制作一个从 date_from 到 date_to 这样的范围作为结果的过滤器
          【解决方案6】:

          试试这个..更改您的表名并运行查询..希望它应该按照您的要求给出结果..如果不让我知道...

          select a.id
               , sum(b.qty)
               , a.date_from
               , a.date_to 
            from table1 a
               , table2 b 
           where a.id = b.allotment_id 
           group 
              by b.allotment_id
          

          【讨论】:

            猜你喜欢
            • 2018-07-31
            • 2011-04-11
            • 1970-01-01
            • 1970-01-01
            • 2021-05-19
            • 1970-01-01
            • 2015-01-31
            相关资源
            最近更新 更多