2011-01-23 2 views
7

У меня есть база данных MYSQL, которая содержит данные о моих клиентах, которые используют наши услуги каждый день.mysql count (*) из нескольких таблиц

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

Я хотел бы подсчитать общее количество транзакций в течение нескольких дней

до сих пор у меня есть оператор выбора, который делает следующее

select 
    (
    select count(customer) from 2010Dec28 
    where customer='<customer name>' 
) as t1, 
    (
    select count(customer) from 2010Dec29 
    where customer='<customer name>' 
)as t2;` 

но это возвращает результат в виде двух отдельных подсчетов

| t1 | t2 | 
| 1438 | 16282 | 
1 row n set (0.00 sec)` 

Мой вопрос в том, как я могу сгенерировать сумму этих двух результатов, не делая этого в своем коде приложения.

+4

Я думаю, что «каждая таблица в базе данных представляет собой один 24-часовой период» - это точка, в которой вы должны остановиться и пересмотреть свой дизайн. –

+1

Следуйте советам, которые люди дают вам и исправляют ваш дизайн. У вас не должно быть отдельной таблицы для каждой даты. В лучшем случае у вас может быть одна таблица для данных в реальном времени и одна таблица для архивированных данных. Дата представляет собой столбец в разных строках таблицы, а не имя таблицы. Тогда запрос на подсчет по дате является простым, как может быть. Если вам нужно временное решение, пока вы не сможете исправить ваш дизайн, используйте запрос «UNION ALL», чтобы объединить несколько запросов в один, а затем заверните весь союз в другой «SELECT» на 'SUM' все подсчеты. –

+0

каждый стол за каждый день - худшая идея, когда-либо я видел, неэффективна, не поддающаяся оценке – Svisstack

ответ

11

Тайлер, вероятно, прав, дизайн, безусловно, неверен!

Но это возможно ..

select 
    sum(a.count) 
from 
    (select count(*) as count from table1 
    union all 
    select count(*) as count from table2) a 
+0

Спасибо за предложение, но это дает мне ошибку, например, ERROR 1248 (42000): Каждая производная таблица должна иметь свой собственный псевдоним –

+0

ok, который зависит от rdbms и im, а не того, что знакомо с mysql , я отредактировал, чтобы добавить псевдоним. –

+0

Хорошо, что это работает для mysql, спасибо за помощь, это будет использовано в краткосрочной перспективе, пока я снова создам db. –

10

Исправьте ваш дизайн базы данных. Если вы не делаете какое-то массовое хранилище данных на миллиардах строк, отдельный стол в день очень не подходит.

4

Просто поменять перекрестное соединение для прямого суб + суб, согласно ниже. Гораздо проще, чем создавать союзы или соединения

select 
    (
    select count(customer) from 2010Dec28 
    where customer='<customer name>' 
) + (
    select count(customer) from 2010Dec29 
    where customer='<customer name>' 
) 
Смежные вопросы