2017-10-15 1 views
0

i zwei Tabellen beitreten wollen, aber ich kann es nicht tun, wie ich Spalte summieren möchten und erhalten das Ergebnis zwischen zwei Terminenkombinieren zwei Tabellen und Summe mysql

erste Tabelle mit dem Namen: vip_allotment_details

allotment_id qty 
2    3 
2    5 
1    2 
1    4 

der zweite Tabellenname: vip_allotment

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

, was ich aus der Abfrage will dieses Ergebnis zu erhalten, mir

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

i das Ergebnis erklären:

erstes allotment_id Feld wird in der zweiten Tabelle mit id-Feld verknüpft, das Ergebnis mag ich, dass wir Summe der Menge durch die beiden Felder (id, allotment_id) machen zwischen der date_from und DATE_TO

und hier ist mein Versuch:

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

In meiner Anfrage bekommt das Ergebnis all die Summe der Menge Feld ohne Filter ..

Ich hoffe, ich habe mein Problem gut erklärt.

danke /.

Antwort

0

Ich bin noch nicht versuchen, aber vielleicht können Sie wie folgt versuchen:

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

dank Mann, es funktioniert, aber ich brauche Datumsbereich auf sie wie date_from> = ‚etwas‘ und DATE_TO <= ‚etwas‘ wünschen, dass Sie mir sagen, wie wenden es auf Ihre Anfrage –

+0

Ok, nur setzen, wo zu machen Klausel für diese Abfrage 'WHERE a.date_from> = '{thedestartart}' AND.date_to <= '{thedateend}'' –

+0

Ihre Begrüßung, einen schönen Tag :) –

0

this..change Ihren Tabellennamen Versuchen und führen die query..hopefully sollte das Ergebnis als Ihre Anforderung. .wenn lassen Sie mich nicht kennen ...

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

Sie müssen JOIN verwenden. Ich sehe, dass Sie IN Schlüsselwort verwenden, das nicht funktioniert. Es gibt viele Möglichkeiten, Ihr Problem zu lösen. Einer von ihnen ist,

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

Wenn Sie mehr als ein Ergebnis wollen eine Aggregatfunktion bilden (SUM, COUNT, AVG, ...) finden Sie eine GROUP BY verwenden müssen. Ihre Abfrage nicht so schwer ist, dies den Trick tun soll:

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 

Und wie man hier sehen kann, erzeugt dies das erwartete Ergebnis: http://sqlfiddle.com/#!9/707a8/2

Wenn Sie nun wollen das Hinzufügen zusätzliche Filter starten (wie Filtern nach Datum), können Sie dies tun, indem Sie der Abfrage einen WHERE hinzufügen. Etwas wie folgt aus:

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

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

Auf einer Seite zur Kenntnis, bemerkte ich Sie Ihre params in der PHP-Teil des Codes nicht bindend. Beachten Sie, dass dies zu ernsthaften Sicherheitsproblemen führen kann, insbesondere wenn diese Daten direkt von der Benutzereingabe stammen. Ich würde vorschlagen, in PDO zu suchen, um die tatsächliche Abfrage in PHP zu tun.

+0

Ich schätze es wirklich und es funktioniert Mann Danke, aber Ich möchte einen Bereich wie von date_from bis date_to als Filter zum Ergebnis machen –

+0

sry, ich habe den Filterteil verpasst. Lass mich meine Antwort aktualisieren ... – Pevara

0

Ich denke, das folgende sollte tun, was Sie fragen.

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

Versuchen Sie unten.Ich denke, dass Sie das gewünschte Ergebnis erhalten werden.

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