2017-02-02 1 views
0

Also, was ich habe ist ein System mit MySQL für die Speicherung, die Spenden von Menschen (Spender) gespeichert werden sollte. Die Spende wird vom autorisierten Benutzer in das System eingegeben. Hier sind Tabellen erstellen für alle 4 Tabellen:Anzeige unübertroffene Daten zusammen mit Aggregatfunktionen und multiple Joins

CREATE TABLE `donator` (
`DONATOR_ID` int(11) NOT NULL AUTO_INCREMENT, 
`DONATOR_NAME` varchar(50) NOT NULL, 
`STATUS` char(1) COLLATE NOT NULL DEFAULT 'A', 
PRIMARY KEY (`DONATOR_ID`) 
) 

CREATE TABLE `user` (
`USER_ID` int(11) NOT NULL AUTO_INCREMENT, 
`USERNAME` varchar(100) NOT NULL, 
`PASSWORD` varchar(200) NOT NULL, 
`TYPE` char(1) COLLATE NOT NULL, 
PRIMARY KEY (`USER_ID`) 
) 

CREATE TABLE `sif_res` (
`RES_ID` int(11) NOT NULL AUTO_INCREMENT, 
`RES_NAME` varchar(50) NOT NULL, 
`MON_VAL` double NOT NULL, 
PRIMARY KEY (`RES_ID`) 
) 

CREATE TABLE `donations` (
`DONATION_ID` int(11) NOT NULL AUTO_INCREMENT, 
`RESOURCE` int(11) NOT NULL, 
`AMOUNT` int(11) NOT NULL, 
`DONATOR` int(11) NOT NULL, 
`ENTRY_DATE` datetime NOT NULL, 
`ENTERED_BY_USER` int(11) NOT NULL, 
PRIMARY KEY (`DONATION_ID``), 
KEY `fk_resurs` (`RESOURCE``), 
KEY `fk_donator` (`DONATOR``), 
KEY `fk_user` (`ENTERED_BY_USER``), 
CONSTRAINT `fk_1` FOREIGN KEY (`DONATOR`) REFERENCES `donator` (`DONATOR_ID`) ON UPDATE CASCADE, 
CONSTRAINT `fk_2` FOREIGN KEY (`RESOURCE`) REFERENCES `sif_res` (`RES_ID`) ON UPDATE CASCADE, 
CONSTRAINT `fk_3` FOREIGN KEY (`ENTERED_BY_USER`) REFERENCES `user` (`USER_ID`) ON UPDATE CASCADE 
) 

Wie Sie sehen können, habe ich eine Liste von Donatoren, Benutzer und Ressourcen, die gespendet werden kann.

Nun, ich möchte alle Namen Donatoren und ihre IDs angezeigt werden, jedoch in dritter Spalte würde Ich mag ihre Balance (Summe aller Gegenstände, die sie gespendet) angezeigt werden - dies wird berechnet mit

Spende .AMOUNT * sif_res.MON_VAL für jede Spende

Die SQL SELECT ich habe Werke geschrieben, aber Donatoren, die alles nicht gespendet haben ausgelassen (sie werden durch JOIN nicht angepasst). (! Mit STATUS = D) ich brauchen würde, dass es jeden zeigt, auch wenn sie noch keine Einträge hat (ihr Gleichgewicht in diesem Fall 0 oder NULL sein)

Das ist mein SQL ich geschrieben habe:

SELECT DONATOR_ID 
, DONATOR_NAME 
, round(SUM(d.AMOUNT * sr.MON_VAL)) as BALANCE 
from donator c 
join donations d on c.DONATOR_ID=d.DONATOR 
join sif_res sr on sr.RES_ID=d.RESOURCE 
where c.STATUS!='D' 
group by DONATOR_ID, DONATOR_NAME 

Also, wenn ich ausführen nächste Sätze:

INSERT INTO donator(DONATOR_NAME, STATUS) VALUES("John", 'A'); //asigns id=1 
INSERT INTO donator(DONATOR_NAME, STATUS) VALUES("Willie", 'A'); //asigns id=2 

INSERT INTO user (USERNAME, PASSWORD, TYPE) VALUES("user", "pass", 'A'); //asigns id=1 

INSERT INTO sif_res(RES_NAME, MON_VAL) VALUES("Flour", "0.5"); //asigns id=1 

INSERT INTO donations(RESOURCE, AMOUNT, DONATOR, ENTRY_DATE, ENTERED_BY_USER) VALUES(1, 100, 1, '2.2.2017', 1); 

werde ich Ausgang (mit meinem SELECT Satz oben) erhalten:

DONATOR_ID | DONATOR_NAME | BALANCE 
-------------------------------------------- 
1   | John   | 50 

, was ich will bekommen, ist:

DONATOR_ID | DONATOR_NAME | BALANCE 
-------------------------------------------- 
1   | John   | 50 
2   | Willie  | 0 

habe ich versucht, alle Version von Verknüpfungen (links, rechts, äußerte, voll, ..) aber keiner von ihnen arbeitete für mich (wahrscheinlich, weil ich sie falsch wurde mit)

Wenn es nur das Problem der nicht passenden Daten war, würde ich in der Lage sein, es zu lösen, aber die Aggregatfunktion SUM und andere JOIN machen alles komplizierter

Antwort

0

eine linke äußere Verknüpfung verwenden auf den zweiten zwei Tabellen tun sollten der Trick:

SELECT c.DONATOR_ID 
, c.DONATOR_NAME 
, ifnull(round(SUM(d.AMOUNT * sr.MON_VAL)),0) as BALANCE 
from donator c 
left outer join donations d on c.DONATOR_ID=d.DONATOR 
left outer join sif_res sr on sr.RES_ID=d.RESOURCE 
where c.STATUS!='D' 
group by DONATOR_ID, DONATOR_NAME 

Ich verpackte auch die BALANCE Ausdruck in ifnull, um 0 statt Null anzuzeigen.

+0

Als ich verschiedene Joins probierte, bin ich nur bei Spenden und Donatoren (und nicht bei Sif_res) dabei - das funktioniert jetzt perfekt, danke! –

Verwandte Themen