2017-10-15 100 views
0

我要加入两个表,但我不能这样做,因为我想两个日期结合两个表,并和MySQL的

命名的第一台之间的总结列,得到的结果: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之间的两个字段(ID,allotment_id)使数量的总和DATE_TO

,这里是我的尝试:

$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') 
"; 

在我的查询结果得到数量字段的全部总和没有过滤..

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

谢谢/。

回答

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; 
+0

感谢的人它的工作原理,但我需要做的日期范围之如date_from> =“东西”和DATE_TO <=“东西”祝你告诉我怎么把它在你的查询 –

+0

好了,只是放在哪里子句在那个查询'WHERE a.date_from> ='{thedatestart}'AND a.date_to <='{thedateend}' –

+0

欢迎您,祝你有美好的一天:) –

0

尝试this..change你的表名和运行query..hopefully也应该给结果作为您的要求。如果不让我知道...

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 
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; 
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中的实际查询。

+0

我真的很感激它,它工作的人感谢,但我想从date_from到date_to这样的范围作为筛选结果 –

+0

sry,我错过了过滤器部分。让我更新我的答案... – Pevara

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 
0

试试below.i认为你会得到你想要的结果。

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