我想加入两张桌子但是我不能这样做,因为我想要对列进行求和并在两个日期之间得到结果
第一个名为: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字段的总和,没有过滤器..
我希望我能很好地解释我的问题。
感谢/.
答案 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';