2017-06-07 4 views
0

I 3 TabellenMysql Union All & order by

Tischelement

id | type 
1 | A 
2 | B 
3 | A 

Tabelle Kommission A

id | member_id |  date  | amount | 
1 |  1  | 2017-06-06 | 30.00 | 
2 |  2  | 2017-06-18 | 20.00 | 
3 |  1  | 2017-06-21 | 10.00 | 
4 |  3  | 2017-06-23 | 30.00 | 
5 |  3  | 2017-06-27 | 30.00 | 

Tabelle Kommission B

id | member_id |  date  | amount | 
1 |  2  | 2017-06-05 | 30.00 | 
2 |  2  | 2017-06-13 | 30.00 | 
3 |  1  | 2017-06-22 | 30.00 | 
4 |  3  | 2017-06-22 | 30.00 | 
5 |  1  | 2017-06-23 | 30.00 | 

i führen wollen zeige nur Mitglied Typ A, und nach Datum geordnet

id |  date  | member id | from 
1 | 2017-06-06 |  1  | table A 
3 | 2017-06-21 |  1  | table A 
3 | 2017-06-22 |  1  | table B 
4 | 2017-06-22 |  3  | table B 
5 | 2017-06-23 |  1  | table B 

und Gesamtbetrag = 130

Ich versuchte dies:

select member_id, date, amount 
from commission A 
union all 
select member_id, date, amount 
from commission B 
order by date asc 

Aber ich konnte nicht nur die Mitglieder des Typs A auswählen: meine Abfrage aller Mitglieder Ergebnisse zeigt.

Wie soll ich das machen?

+0

Welche Abfrage haben Sie versucht? – Andy

+0

select member_id, Datum, Betrag von Provision A union alle wählen member_id, Datum, Betrag von Provision B ordered by Datum asc – imnorio

+0

Ich konnte nicht wählen Mitglied Typ A nur ausgewählt, meine Abfrage zeigen alle Mitglieder Ergebnis – imnorio

Antwort

0

Sie benötigen die members Tabelle, um auf die Art zu filtern verbinden:

select  c.* 
from  member m 
inner join (
      select id, member_id, `date`, amount, 'table A' `from` 
      from commissionA 
      union all 
      select id, member_id, `date`, amount, 'table B' `from` 
      from commissionB 
      ) c 
     on m.id = c.member_id 
where  m.type = 'A' 
order by c.`date` asc 

NB: Ich Namen wie date und from vermeiden würde, da sie eine besondere Bedeutung haben.

Um die Summe in einer zusätzlichen Zeile zu erhalten, gruppieren Sie nach allen Feldern (außer Betrag) und fügen Sie die with rollup-Klausel hinzu. Schließlich filtern Sie alle Zwischensummen, die generiert werden:

select * 
from (
    select  c.id, c.member_id, c.`date`, sum(c.amount) amount, c.`from` 
    from  member m 
    inner join (
       select id, member_id, `date`, amount, 'table A' `from` 
       from commissionA 
       union all 
       select id, member_id, `date`, amount, 'table B' `from` 
       from commissionB 
       ) c 
      on m.id = c.member_id 
    where  m.type = 'A' 
    group by c.id, c.member_id, c.`date`, c.`from` with rollup) base 
where  id is null or `from` is not null; 
order by `date` asc 
+0

Wie wäre es mit dem Gesamtbetrag? Wo sollte ich SUM() hinzufügen? – imnorio

+0

Ich habe einen Abschnitt darüber in meiner Antwort hinzugefügt. – trincot