У меня есть более 15 таблиц с электронными письмами. Мне нужно подсчитать, сколько электронных писем существует у каждого интернет-провайдера, например GMAIL, VMG, MSFT или другого.
Используя приведенный ниже запрос, я могу получить количество интернет-провайдеров для одной таблицы:
SELECT COUNT(`my_isp`) AS 'COUNT', `my_isp` FROM `table1` GROUP BY `my_isp`
Это выдаст что-то вроде этого:
COUNT | my_isp
---------------
4000 | Gmail
---------------
2000 | MSFT
---------------
10000 | other
---------------
15000 | VMG
---------------
Что мне нужно сделать, так это получить общее количество вышеперечисленных значений для каждой таблицы, а у меня более 15 таблиц.
Честно говоря, я не совсем уверен, с чего начать.
** РЕДАКТИРОВАТЬ **
Все таблицы имеют одинаковый формат с одинаковыми столбцами. Все они выглядят так:
EMAIL | PROPERTY | STATUS | MY_ISP | CREATED_DATE | OTHER_DATES
Некоторые электронные письма будут существовать в нескольких таблицах. СОБСТВЕННОСТЬ каждой таблицы будет разной, как и столбцы СТАТУС и Дата (я не перечислял все столбцы даты).
** РЕДАКТИРОВАТЬ 2 **
Итак, я попытался использовать UNION ALL следующим образом:
select COUNT(`my_isp`) AS 'COUNT'
from (select count(t1.`my_isp`) from `table1` t1
UNION ALL
select count(t2.`my_isp`) from `table2` t2
)
Но я получаю следующую ошибку:
#1248 - Every derived table must have its own alias
Кстати, UNION ALL, скорее всего, будет вашим другом...
Я согласен, что они являются хорошими кандидатами для объединения в одну таблицу, а не в 15. Несмотря на это, вы, вероятно, ищете утверждение UNION
.
@erik258 Erik258 Эм, UNION платит штраф за дедупликацию. ОП захочет СОЮЗ ВСЕХ
@MatBailie - ну, в каждой таблице одни и те же столбцы (EMAIL, PROPERTY MY_ISP, STATUS и т. д.). В каждой таблице могут быть адреса электронной почты, которые существуют в других таблицах (это то, что мне нужно будет обсудить в другом вопросе). Но они все одинаковые, но СОБСТВЕННОСТЬ в каждой таблице будет разная. Надеюсь, это ответит на ваш вопрос. Я отредактирую вопрос, включив в него эту информацию.
Если каждая из таблиц имеет одинаковые столбцы, вам определенно следует построить ее как ОДНУ ТАБЛИЦУ с дополнительным столбцом для поставщика.
@JoelCoehoorn Я могу рассмотреть возможность сокращения до одной таблицы. Единственная проблема заключается в том, что одна таблица может содержать около 25 миллионов записей, если не больше. Не говоря уже о том, что одно электронное письмо может существовать несколько раз. Что вы об этом думаете?
Рекорды есть рекорды. Если у вас 25 миллионов, вам нужны ресурсы сервера для их обработки, будь то в одной таблице или в нескольких. Индексируйте правильно, сначала с провайдером, это не имеет значения.
Все попытки вашего союза были близки. Вы хотите вернуть my_isp из каждой таблицы.
Ошибка «Каждая производная таблица должна иметь свой собственный псевдоним» говорит о том, что когда вы выбираете подзапрос или присоединяетесь к нему, вам необходимо присвоить ему псевдоним (as somealias
или просто somealias
после закрывающей скобки).
Кроме того, вы неправильно понимаете COUNT; выражение, которое вы передаете count, проверяется только на предмет того, является ли оно NULL, а count возвращает количество ненулевых значений для каждой группы; если вы опустите предложение group by
, группа будет состоять из всех строк. В этом случае вам нужно просто count(1)
, но также сгруппировать и выбрать файл my_isp.
Так:
select my_isp, count(1) as isp_count
from (
select my_isp from table1
union all
select my_isp from table2
...
) as unioned_tables
group by my_isp
Возможно, будет более эффективно подсчитывать данные внутри каждой таблицы и суммировать их:
select my_isp, sum(isp_count) as isp_count
from (
select my_isp, count(1) as isp_count from table1 group by my_isp
union all
select my_isp, count(1) as isp_count from table2 group by my_isp
...
) as unioned_table_counts
group by my_isp
Не касаясь вопроса правильной организации таблиц (или одной таблицы), можно указать, что ошибка
#1248 - Every derived table must have its own alias
вызвано отсутствием имени подзапроса.
Это слишком простая ошибка, чтобы ее обсуждать)
Собственно, запрос может быть таким.
select my_isp ,sum(cnt) AS total
from (select my_isp,count(t1.`my_isp`) cnt from `table1` t1 group by my_isp
UNION ALL
select my_isp,count(t2.`my_isp`) cnt from `table2` t2 group by my_isp
) subquery_name
group by my_isp
Похоже, все, что мне нужно сделать, это продолжать добавлять UNION ALL, если я хочу добавить дополнительные таблицы. Спасибо. Я думаю, это решит мою проблему.
Хотите описать или показать определения этих таблиц? (Если у них одинаковые определения, почему это отдельные таблицы?)