2014-08-27 3 views
2

У меня довольно сложная проблема с MySQL.Группа MySQL и сумма с объединенными таблицами

У меня есть две таблицы с одного до многих отношения (ниже colums, которые имеют отношение)

Таблица A (кампании):

id | channel_type | date 

Таблица B (бюджеты):

id | campaign_id | budget 

Мне нужен один запрос для получения следующего результата:

  • Количество кампаний: channel_type
  • Сумма всех бюджетов, связанных с найденными кампаниями.

Мне нужно фильтровать результаты по столбцам в таблице кампании (например WHERE campaigns.date> '2014-05-01')

Я попытался следующий подход:

SELECT channel_type, COUNT(*) cnt, 
    (SELECT SUM(budget) FROM budgets WHERE budgets.campaign_id = campaigns.id)) 
     as budget 
FROM campaigns 
WHERE campaigns.date >= 'some-value' 
    AND [more conditions] 
GROUP BY campaigns.channel_type 

Но это конечно, терпит неудачу из-за GROUP, я получаю только первый результат campaigns.id для channel_type.

Любые советы (и решения) будут действительно оценены!

ТИА

+1

набор это в [SQL скрипку] (http://sqlfiddle.com/) и я помогу –

+0

Если вы все еще заинтересованы я положил его в скрипкой: [ здесь] (http://sqlfiddle.com/#!2/a5e42/5) – duffpl

ответ

0

Я нашел рабочее решение. Здесь работает запрос:

SELECT SUM(budget) as budget, COUNT(*) as count FROM 
    (SELECT * FROM campaigns WHERE [conditions]) AS found_campaigns 
    LEFT JOIN budgets ON budgets.campaign_id = found_campaigns.id 
    GROUP BY channel_type 
0
  1. Получить общий бюджет из таблицы бюджетов с использованием GROUP BY campain_id. Это будет подзапрос. Назови это. Например, A.
  2. Теперь получите общее количество идентификаторов из кланов, используя GROUP BY channel_type и WHERE date> = 'some-value'.
  3. Используйте шаг 2 и 1 (подзапрос будет действовать как таблица) в окончательном запросе, и вы получите результаты. Вы можете отправить схему, а затем я могу проверить.
0

Я думаю, что это должно работать:

SELECT channel_type, COUNT(*) cnt, 
    (SELECT SUM(t2.budget) FROM budgets t2 WHERE t2.campaign_id IN (
    SELECT t3.id FROM campaigns t3 WHERE t3.channel_type = t1.channel_type)) 
    AS budget 
FROM campaigns t1 
WHERE t1.date >= 'some-value' 
    AND [more conditions] 
GROUP BY t1.channel_type 

посмотреть fiddle

+0

Работает как ожидалось :) Мне интересно, как быстро это будет. Я где-то слышал, что IN с подзапросом не очень эффективен. Однако im слишком noobish в SQL, чтобы подтвердить или предложить лучшее решение в любом случае. Будут запускать некоторые контрольные показатели при работе с большим набором данных. Спасибо – duffpl

+0

Я проанализировал ваше решение и не работает должным образом. В основном запросе вы используете channel_type, который подается во второй подзапрос, чтобы получать идентификаторы кампании. Hovewer это пропускает условие WHERE. Условие подсчитывает кампании с определенным условием даты. Принимает их channel_types, а затем извлекает ВСЕ кампании с найденным каналом_имя и передает их в запрос SUM (бюджет).Итак, если у нас есть 10 кампаний типа «1», а WHERE разбивает 2 из них, то счет отлично (2), но бюджет рассчитан для всех (10) кампаний типа канала «1». – duffpl

+0

Почему бы вам просто не добавить условие даты в подзапрос? SELECT t3.id Из кампаний t3 WHERE t3.channel_type = t1.channel_type И t3.date> = t1.date – Logar

Смежные вопросы