У меня есть более 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
🤔 А знаете ли вы, что...
SQL был создан в 1970-х годах компанией IBM.
Все попытки вашего союза были близки. Вы хотите вернуть 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