MySQL - 如何在同一查询中使用ROLLUP和ORDER BY

时间:2014-11-05 13:29:31

标签: php mysql

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 ;

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

在生产环境中使用之前,您应该使用填充表测试此查询。表现可能很差......