SELECT donator, event, SUM(amount) AS total_donation_per_donator
FROM tr_donation WHERE ngopkid=1
GROUP BY donator, event WITH ROLLUP
使用上面的查询我得到的结果低于结果。
Johnny Cruz
Charity: Event 001 | Amount: US$ 100
Charity: Event 002 | Amount: US$ 30
Charity: Event 003 | Amount: US$ 90
Total : US$ 220
Mike Polo
Charity: Event 002 | Amount: US$ 200
Charity: Event 004 | Amount: US$ 125
Total : US$ 325
现在我想按每个捐赠者的子总数对数据进行排序(例如:325美元,220美元),因此捐赠额最高的捐赠者将首先显示。
下面的查询是按升序排序记录,但是如果我使用DESC和' total_donation_per_donator',它会按降序错误排序所有数据,这会导致错误的结果。
SELECT * FROM (
SELECT *, SUM(amount) AS total_donation_per_donator
FROM tr_donation
WHERE ngopkid=1
GROUP BY donator, event
WITH ROLLUP
)
temp_tr_donation ORDER BY total_donation_per_donator
这是表结构。
CREATE TABLE IF NOT EXISTS `tr_donation` (
`pkid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`ngopkid` bigint(20) unsigned NOT NULL DEFAULT '0',
`donator` varchar(100) NOT NULL DEFAULT '',
`eventpkid` bigint(20) unsigned NOT NULL DEFAULT '0',
`event` varchar(100) NOT NULL DEFAULT '',
`amount` float unsigned NOT NULL DEFAULT '0',
`postdate` datetime DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`pkid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
答案 0 :(得分:1)
SELECT
donation.`donator`,
donation.`event`,
SUM(donation.`amount`) AS total_donation_per_donator_and_event,
sumdonation.total_donation_per_donator
FROM tr_donation AS donation
INNER JOIN (
SELECT
`donator`,
SUM(`amount`) AS total_donation_per_donator
FROM tr_donation
GROUP BY `donator`
) AS sumdonation ON sumdonation.`donator` = donation.`donator`
GROUP BY
donation.`donator`,
donation.`event`
ORDER BY
sumdonation.total_donation_per_donator DESC,
donation.`event` ASC
在生产环境中使用之前,您应该使用填充表测试此查询。表现可能很差......