2012-04-16 2 views
0

Я хочу запустить запрос, который генерирует отчет о доходах для кампаний. Есть 2 стола членов и платежи.Оптимизировать запрос для MySQL

members (id, campaign_code) 
payments (id, member_id, amount) 

Я хочу, чтобы создать таблицу группы по campaign_code, т.е. в этом формате

campaign_code, member_count, total_revenue 

Я кладу все кампании в массив и работает это,

SELECT sum(amount) AS amt 
FROM (members 
INNER JOIN payments 
    ON payments.member_id = members.id 
) 
WHERE campaign_code = 'XX' 

и занимает много времени. В любом случае, чтобы оптимизировать это или сделать это в одном запросе?

+0

ли member_id и идентификатор имеет индексы? – Chris

+0

Да, у обоих есть индексы. В платежах будет около 75 тыс. Членов и 80 тыс. Строк. Не много. – daydreamer

+0

'... где campaign_code в (xx, yy, zz)'. Сделайте цикл, чтобы создать единый оператор sql, который выглядит так. – Stevo

ответ

0

платежи (идентификатор, member_id, сумма) Я хочу, чтобы создать таблицу группы по CAMPAIGN_CODE, то есть в этом формате

campaign_code, member_count, total_revenue Я помещаю все кампании в массив и запускаю это,

select 
     m.Campaign_Code, 
     count(distinct p.member_id) as Members, 
     count(*) as PaymentEntries, 
     sum(p.amount) as TotalRevenue 
    from 
     members m 
     join Payments p 
      on m.id = p.member_id 
    where 
     m.campaign_code = 'XX' 

Если вы хотите все кампании, просто удалите предложение WHERE. Вы упомянули в комментариях, что таблицы имеют индексы, но я бы удостоверился, что таблица участников имеет индекс в campaign_code, а у платежей есть индекс на member_id.

В этом запросе будет указано количество членов, внесших вклад, общее количество вкладов (в случае, если один или несколько членов предоставили несколько раз) и итоговые суммы всех взносов.

+0

Спасибо Drapp, но это решение дает мне общую картину. Мне действительно нужны данные на основе кодов кампании, я понял это. – daydreamer

0

использование

where campaing_code in ('XX','YY','ZZ','AA','BB') 

и имеют индекс campaing_code

1

Как вы сказали, что вам нужна агрегация для всего кода кампании, попробуйте это

SELECT m.campaign_code , count(p.member_id) AS member_count, 
    SUM(amount) AS total_revenue 
FROM members m, payments p 
WHERE p.member_id = m.id 
GROUP BY campaign_code; 

Убедитесь, что читать на тузд группы функции

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