任何人都可以帮助我理解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函数,如果这是有意义的 - 我想要为每次拍卖计算获胜者的数量,但是在拍卖中每个拍卖品的结果中显示。
答案 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
表上进行子选择以计算每次拍卖的总和,然后将其结果视为一个单独的表,您可以将其加入到结果中。