MySQL ВНУТРЕННЕЕ СОЕДИНЕНИЕ с GROUP BY и COUNT (*) - PullRequest
0 голосов
/ 05 марта 2020

Я никогда не мог разобраться с ВНУТРЕННИМИ СОЕДИНЕНИЯМИ (или любыми другими типами СОЕДИНЕНИЙ в этом отношении), поэтому я изо всех сил пытаюсь понять, как использовать это в моей конкретной c ситуации. На самом деле, я даже не уверен, что мне это нужно. Я смотрел на другие примеры и читал учебные пособия, но мой мозг, похоже, просто не работает так, как нужно для его получения (или он вообще не работает).

Вот сценарий:

У меня есть две таблицы -

  1. phone_numbers - эта таблица содержит список телефонных номеров, принадлежащих множеству разных клиентов. Один клиент может иметь несколько номеров. Для простоты мы будем говорить, что поля 'number_id', 'customer_id', 'phone_number'.
  2. call_history - в этой таблице есть запись каждого отдельного вызова, что один из этих номеров в Первый стол мог иметь. Там есть запись для каждого отдельного звонка на протяжении многих лет. Опять же, для простоты, мы скажем, что соответствующие поля являются customer_id, phone_number, call_start_time.

То, что я пытаюсь сделать sh, - это найти все числа, принадлежащие конкретному customer_id в таблице телефонных номеров и использовать эту информацию для поиска в таблице call_history и определения количества вызовов, полученных каждым номером телефона, и сгруппировать их по количеству вызовов для каждого номера, предпочтительно также показывая нули, где номер не имеет принимал любые звонки вообще.

Причина, по которой нулевые вызовы важны, заключается в том, что это данные, которые меня интересуют. В противном случае, я мог бы просто получить всю информацию из таблицы call_history. Но то, что я пытаюсь достичь, это найти цифры без активности.

Все, что мне удалось сделать sh - это выполнить один запрос, чтобы получить все номера, принадлежащие одному клиенту:

SELECT customer_id, phone_number FROM phone_numbers WHERE customer_id = Y;

Затем выполнить второй запрос, чтобы получить все телефоны. вызовы для этого customer_id в течение установленной продолжительности:

SELECT customer_id, phone_number, COUNT(*) FROM call_history WHERE customer_id = Y and call_start_time >= DATE_SUB(SYSDATE(), INTERVAL 30 DAY) GROUP BY phone_number;

Затем мне пришлось использовать данные, возвращенные в обоих запросах, и использовать функцию VLOOKUP в Excel, чтобы сопоставить количество вызовов для каждого отдельного номера со второго запросить список всех номеров из первого запроса, оставив, таким образом, пробелы в моей таблице «все номера» и определив номера, на которые не было звонков за этот период времени.

Я надеюсь, что есть какой-то способ сделать все это с помощью одного запроса и возвращает таблицу результатов, перечисляя нулевое количество вызовов с ним и исключая весь ручной бит Excel, поскольку он не слишком эффективен и подвержен человеческим ошибкам.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Без по крайней мере подходящего примера вы не сможете воссоздать вашу ситуацию. В любом случае, INNER JOIN может не вернуть результат так, как вы ожидали. В мое короткое время с MySQL я в основном использую 2 типа JOIN; один уже упоминался, а другой - LEFT JOIN. Из того, что я могу понять в вашем вопросе, что вы хотите достичь, можно сделать, используя LEFT JOIN вместо INNER JOIN. Возможно, я не лучший человек, чтобы объяснить это вам, но я так понимаю:

INNER JOIN - возвращать только то, что соответствует предложению ON, между двумя (или более) таблицами.

LEFT JOIN - вернет все из таблицы с левой стороны объединения и вернет NULL, если ON не найдет совпадений в таблице с правой стороны объединения ... если вы не укажете условие WHERE для чего-то в правой таблице.

Теперь, вот мое предложение с запросом, и, надеюсь, оно будет полезно для вас:


SELECT A.customer_id, A.phone_number, 
       SUM(CASE WHEN call_start_time >= DATE_SUB(SYSDATE(), INTERVAL 30 DAY) 
                THEN 1 ELSE 0 END) AS Total 
FROM phone_numbers A 
LEFT JOIN call_history B
ON A.customer_id=B.customer_id 
GROUP BY A.customer_id,A.phone_number;

Что я сделал здесь, так это I LEFT JOIN таблица phone_numbers с call_history на customer_id и я -подстановите условие WHERE call_start_time >= .. в выражение CASE в SELECT, так как установка его в WHERE превратит это в обычное или внутреннее соединение.

Вот пример скрипты: https://www.db-fiddle.com/f/hriFWqVy5RGbnsdj8i3aVG/1

0 голосов
/ 05 марта 2020

Для внутреннего присоединения Вы должны сделать это следующим образом.

ВЫБЕРИТЕ customer_id, номер_телефона FROM номер_файла как pn, call_history как ch, где pn.customer_id = ch.customer_id и call_start_time> = DATE_SUB (SYSDATE ( ), ИНТЕРВАЛ 30 ДНЯ) GROUP BY phone_number;

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

...