Итак, у меня есть система, использующая MySQL для хранения, которая должна хранить пожертвования, сделанные людьми (донорами). Пожертвование вводится в систему уполномоченным пользователем. Вот создавать таблицы для всех 4-х таблиц:Отображать непревзойденные данные вместе с агрегатными функциями и несколькими объединениями
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
)
Как вы можете видеть, у меня есть список жертвователей, пользователей и ресурсов, которые могут быть пожертвованы.
Теперь я хочу, чтобы отобразить имя всех жертвователей и их идентификаторы, однако в третьей колонке я хотел бы показать их баланс (сумма всех предметов, которые они пожертвовали) - это рассчитывается с
донорства .AMOUNT * sif_res.MON_VAL для каждого пожертвования
SQL-SELECT, которые я написал работ, однако жертвователи, не подарены ничего оставлены вне (они не совпадают по JOIN). (! С STATUS = D) я должен был бы, что он отображает все, даже если они не имеют каких-либо записей (в том случае, если их баланс может быть 0 или NULL)
Это мой SQL я написал:
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
Так что, если я выполнить следующие предложения:
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);
я получить выход (с моим предложением SELECT, выше):
DONATOR_ID | DONATOR_NAME | BALANCE
--------------------------------------------
1 | John | 50
Что я хочу получить это:
DONATOR_ID | DONATOR_NAME | BALANCE
--------------------------------------------
1 | John | 50
2 | Willie | 0
Я пробовал все версии объединения (слева, справа, наружный, полный, ..), однако ни один из них не работал для меня (вероятно потому, что я использовал их неправильно)
Если бы это была просто проблема непревзойденных данных я смог бы решить эту проблему, однако агрегатную функцию SUM и другие РЕГИСТРИРУЙТЕСЬ сделать это все более сложные
Когда я пытался использовать различные объединения, я присоединился к пожертвованиям и пожертвованиям (а не sif_res) - теперь это прекрасно работает, спасибо! –