MySQL Group By с Sum удаляет слишком много информации - PullRequest
1 голос
/ 04 октября 2011

Может кто-нибудь помочь мне понять, как работает MySQL Group By и что я делаю неправильно?Я использую базу данных с двумя таблицами, аукционами и лотами.В таблице лотов есть столбец для «аукциона», который связывает каждый лот с соответствующим аукционом, а соотношение между множеством аукционов и лотов одно.

Я выбираю большое количество информации как из лотов, так и из аукционов, включая использование нескольких функций сумм и подсчета (различных) для суммирования некоторых записей в таблице лотов для каждого аукциона.

Мой запрос выглядит примерно так:

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'

'wardid '- это первичный ключ для таблицы аукционов и внешний ключ для таблицы лотов.'lotid' является первичным ключом для таблицы лотов, но не используется.

Когда я запускаю этот запрос, я получаю по одной строке для каждого аукциона, и я ищу по одной строке для каждого лота, синформация об аукционе одинакова для каждого лота в этом аукционе, а функции сумм и подсчетов подсчитывают общие размеры и количество победителей для каждого аукциона из таблицы лотов.Если я избавлюсь от частей запроса 'group by' и 'sum', то получу правильное количество строк, по одной на каждый лот.Есть ли способ получить все нужные мне строки с помощью функций sum и count?По сути, я хочу, чтобы предложение group применялось только к функциям SUM и COUNT, если это имеет смысл - я хочу, чтобы количество победителей рассчитывалось для каждого аукциона, но отображалось в результатах для каждого лота этого аукциона.

Ответы [ 2 ]

1 голос
/ 04 октября 2011
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) 

Это повторяет одни и те же итоги за аукцион для лотов, поступающих с одного аукциона.

0 голосов
/ 04 октября 2011

Полагаю, что-то подобное может сработать (предупреждение: не проверено!):

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 для расчета сумм за аукцион, а затем обрабатываетерезультаты этого, как если бы это была отдельная таблица, которую вы можете присоединить к результатам.

...