MySQL Group By with Sum删除了太多信息

时间:2011-10-04 11:45:24

标签: mysql count group-by sum

任何人都可以帮助我理解MySQL的Group By如何工作以及我做错了什么?我正在使用一个包含两个表,拍卖和批次的数据库。批次表有一个“auctionid”列,它将每个批次链接到相关的拍卖,拍卖和拍卖之间有一个很多关系。

我从拍卖品和拍卖中选择了大量信息,包括使用一些总和和计数(不同)函数在每个拍卖的基础上总计批量表中的一些记录。

我的查询是这样的:

SELECT
  auction.`countryId`,
  auction.`date`,
  auction.`name`,
  auction.`awardComments`,
  lots.`lotName`,
  lots.`region`,
  lots.`popCovered`,

  SUM(lots.'size'),
  SUM(lots.`paired`),
  SUM(lots.`unpaired`),
  COUNT(DISTINCT 'lots.winner')

FROM auction join lots USING ('awardid') 

GROUP BY lots.'awardid'

'awardid'是拍卖表的主键和批次表的外键。 'lotid'是批次表的主键,但未使用。

当我运行此查询时,我为每次拍卖获得一行,我正在寻找的是每一批的一行,拍卖中的每一批拍卖信息相同,总和和计数函数计算总数批量表中每个拍卖的大小和获胜者数量。如果我摆脱了查询的“分组依据”和“总和”部分,那么我得到正确的行数,每批一行。有没有办法通过sum和count函数获得我需要的所有行?基本上我只希望group子句适用于SUM和COUNT函数,如果这是有意义的 - 我想要为每次拍卖计算获胜者的数量,但是在拍卖中每个拍卖品的结果中显示。

2 个答案:

答案 0 :(得分:1)

SELECT
  a.countryId,
  a.`date`,
  a.name,
  a.awardComments,
  l.lotName,
  l.region,
  l.popCovered,

  sums.total_size,
  sums.total_paired,
  sums.total_unpaired,
  sums.winners

FROM auction a
INNER JOIN lots l on (a.awardid = l.awardid) 
INNER JOIN (
  SELECT 
    a2.id as auction_id
    SUM(l2.size) as total_size,
    SUM(l2.paired) as total_paired,
    SUM(l2.unpaired) as total_unpaired,
    COUNT(DISTINCT l2.winner) as winners
  FROM AUCTION a2 INNER JOIN lots l2 ON (a2.awardid = l2.awardid)
  GROUP BY a2.id
  ) sums ON (sums.auction_id = a.id) 

对于来自同一拍卖的拍品,每次拍卖会重复相同的总计。

答案 1 :(得分:0)

我想这样的事情可以起作用(警告:未经测试!):

SELECT 
  auction.`countryId`,
  auction.`date`,
  auction.`name`,
  auction.`awardComments`,
  lots.`lotName`,
  lots.`region`,
  lots.`popCovered`,
  sums.`size`,
  sums.`paired`,
  sums.`unpaired`,
  sums.`winners`
FROM auction
JOIN lots USING (`awardid`)
JOIN (
  SELECT
    `awardid`,
    SUM(`size`) AS `size`,
    SUM(`paired`) AS `paired`,
    SUM(`unpaired`) AS `unpaired`,
    COUNT(DISTINCT lots.`winner`) AS `winners`
  FROM lots GROUP BY `awardid`
) AS sums USING (`awardid`)

也就是说,您在lots表上进行子选择以计算每次拍卖的总和,然后将其结果视为一个单独的表,您可以将其加入到结果中。