结合两个表和sum mysql

时间:2017-10-15 17:10:38

标签: php mysql sum

我想加入两张桌子但是我不能这样做,因为我想要对列进行求和并在两个日期之间得到结果

第一个名为: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字段的总和,没有过滤器..

我希望我能很好地解释我的问题。

感谢/.

6 个答案:

答案 0 :(得分:0)

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

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;

答案 1 :(得分:0)

试试这个..改变你的表名并运行查询。但是它应该把结果作为你的要求..如果不让我知道......

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

答案 2 :(得分:0)

您需要使用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 :(得分:0)

如果你想要一个聚合函数(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部分绑定你的params。请注意,这可能会造成严重的安全问题,尤其是如果这些日期直接来自用户输入。我建议查看PDO以在PHP中进行实际查询。

答案 4 :(得分:0)

我认为以下内容应该按照您的要求进行。

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

答案 5 :(得分:0)

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

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';