2017-10-15 103 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';