Получите количество каждого типа электронной почты из нескольких таблиц

У меня есть более 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.


50
2

Ответы:

Все попытки вашего союза были близки. Вы хотите вернуть 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
мой_исп общий Google 3 Yahoo 2 другой 1

рабочий пример