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

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

Хотите описать или показать определения этих таблиц? (Если у них одинаковые определения, почему это отдельные таблицы?)

MatBailie 23.08.2024 14:45

Кстати, UNION ALL, скорее всего, будет вашим другом...

MatBailie 23.08.2024 14:49

Я согласен, что они являются хорошими кандидатами для объединения в одну таблицу, а не в 15. Несмотря на это, вы, вероятно, ищете утверждение UNION.

erik258 23.08.2024 14:49

@erik258 Erik258 Эм, UNION платит штраф за дедупликацию. ОП захочет СОЮЗ ВСЕХ

MatBailie 23.08.2024 14:52

@MatBailie - ну, в каждой таблице одни и те же столбцы (EMAIL, PROPERTY MY_ISP, STATUS и т. д.). В каждой таблице могут быть адреса электронной почты, которые существуют в других таблицах (это то, что мне нужно будет обсудить в другом вопросе). Но они все одинаковые, но СОБСТВЕННОСТЬ в каждой таблице будет разная. Надеюсь, это ответит на ваш вопрос. Я отредактирую вопрос, включив в него эту информацию.

John Beasley 23.08.2024 14:58

Если каждая из таблиц имеет одинаковые столбцы, вам определенно следует построить ее как ОДНУ ТАБЛИЦУ с дополнительным столбцом для поставщика.

Joel Coehoorn 23.08.2024 15:33

@JoelCoehoorn Я могу рассмотреть возможность сокращения до одной таблицы. Единственная проблема заключается в том, что одна таблица может содержать около 25 миллионов записей, если не больше. Не говоря уже о том, что одно электронное письмо может существовать несколько раз. Что вы об этом думаете?

John Beasley 23.08.2024 15:41

Рекорды есть рекорды. Если у вас 25 миллионов, вам нужны ресурсы сервера для их обработки, будь то в одной таблице или в нескольких. Индексируйте правильно, сначала с провайдером, это не имеет значения.

Joel Coehoorn 23.08.2024 15:45
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
8
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

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

Похоже, все, что мне нужно сделать, это продолжать добавлять UNION ALL, если я хочу добавить дополнительные таблицы. Спасибо. Я думаю, это решит мою проблему.

John Beasley 23.08.2024 17:38

Другие вопросы по теме

Похожие вопросы