MySQL Group By Sum删除过多信息

MySQL Group By Sum删除过多信息,mysql,count,group-by,sum,Mysql,Count,Group By,Sum,有谁能帮我理解MySQL的GroupBy是如何工作的以及我做错了什么?我使用的数据库有两个表,拍卖和拍卖。lot表中有一列“auctionid”,它将每个地块链接到相关的拍卖,拍卖和地块之间有一个“一:多”关系 我从标段和拍卖中选择了大量信息,包括使用两个求和和计数(不同)函数,在每次拍卖的基础上合计标段表中的一些记录 我的问题是这样的: SELECT auction.`countryId`, auction.`date`, auction.`name`, auction.`aw

有谁能帮我理解MySQL的GroupBy是如何工作的以及我做错了什么?我使用的数据库有两个表,拍卖和拍卖。lot表中有一列“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”是拍卖表的主键,是lots表的外键lotid'是lots表的主键,但未使用

当我运行此查询时,每次拍卖都会得到一行,我要查找的是每一批的一行,拍卖中的每一批的拍卖信息都相同,总和和计数函数从lots表中计算每次拍卖的总规模和中奖者数量。如果我去掉了查询中的“groupby”和“sum”部分,那么我就得到了正确的行数,每批一行。有没有办法通过求和和和计数函数获得我需要的所有行?基本上,我只希望group子句应用于SUM和COUNT函数,如果这有意义的话-我希望计算出每次拍卖的中奖者数量,但显示在该次拍卖中每个地块的结果中

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) 
对于来自同一次拍卖的地块,每次拍卖重复相同的总数


对于来自同一次拍卖的地块,每次拍卖都会重复相同的总数。

我想类似的方法可能会奏效(警告:未测试!):


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

我猜类似的操作可能会起作用(警告:未测试!):



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

此表的候选键是什么?看起来您在表列表中遗漏了一个逗号:
来自拍卖,lots
@eugeney,他实际上错过了一个
join
关键字。@JStead,我不知道候选关键字是什么-'awardid'是拍卖表的主键,并且还将每个批次记录链接到其父拍卖。@Johan,是的,我在编辑查询时无意中删除了'join'关键字,将其添加回,谢谢。这个表的候选键是什么?看起来你在表列表中漏掉了一个逗号:
来自拍卖,lots
@eugeney,他实际上漏掉了一个
加入
关键字。@JStead,我不知道候选键是什么-'awardid'是拍卖表的主键,并且还将每个拍卖记录链接到其父拍卖。@Johan,是的,我在编辑查询时无意中删除了“join”关键字,并将其添加回,谢谢。@IlmariKaronen,我知道,OP明确要求每批1行。他已经有了每次拍卖的查询。这给了我正确的行数,但是求和和和计数函数并不是对所有的拍卖进行求和,它们只是给了我该拍卖的答案-每个拍卖都有一个赢家,但我想看看每个拍卖都有多少不同的赢家。我希望每一个拍卖行都包含有关整个拍卖以及该特定拍卖的信息。您所需要做的就是修改查询中的GROUP BY子句,如
GROUP BY a.id,l.id WITH ROLLUP
——检查它:@DERELERELEREED,这是错误的
按a.id分组,l.id
按l.id分组
相同,且带汇总的将给出所有拍卖的总计;i、 e.如果涉及一次以上的拍卖,将给出错误的结果<不过,代码>加上汇总通常不是个坏主意。@Johan。非常感谢您的帮助。@IlmariKaronen,我知道,OP特别要求每批1行。他已经有了每次拍卖的查询。这给了我正确的行数,但是求和和和计数函数并不是对所有的拍卖进行求和,它们只是给了我该拍卖的答案-每个拍卖都有一个赢家,但我想看看每个拍卖都有多少不同的赢家。我希望每一个拍卖行都包含有关整个拍卖以及该特定拍卖的信息。您所需要做的就是修改查询中的GROUP BY子句,如
GROUP BY a.id,l.id WITH ROLLUP
——检查它:@DERELERELEREED,这是错误的
按a.id分组,l.id
按l.id分组
相同,且带汇总的将给出所有拍卖的总计;i、 e.如果涉及一次以上的拍卖,将给出错误的结果<不过,代码>加上汇总通常不是个坏主意。@Johan。非常感谢你的帮助。你刚才复制粘贴了我的答案:-?尽管
using
子句模棱两可,但我认为它不会起作用。然后再选择所有的拍品,不管它们属于哪一场拍卖。@Johan:伟人所见略同。:)无论如何,子选择应该起作用:记住,
lots.awardid
是拍卖表的外键,因此具有相同awardid的地块属于相同的拍卖。不过,关于使用语法的
问题,您可能是对的;我认为它应该按原样工作,但我还没有测试它。你只是复制粘贴了我的答案:-?尽管
using
子句模棱两可,但我认为它不会起作用。然后再选择所有的拍品,不管它们属于哪一场拍卖。@Johan:伟人所见略同。:)无论如何,子选择应该起作用:记住,
lots.awardid
是拍卖表的外键,因此具有相同awardid的地块属于相同的拍卖。关于
U,你可能是对的
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`)