Почему GROUP_BY не возвращает нужные записи? - PullRequest
0 голосов
/ 26 января 2019

С учетом таблицы:

invitations (id, created_at, type, email)

С учетом следующего запроса:

SELECT DISTINCT email_address
FROM invitations
WHERE type = 'email'
AND date(created_at) in (curdate() - interval 3 day, 
                           curdate() - interval 8 day,
                           curdate() - interval 13 day,
                           curdate() - interval 21 day,
                           curdate() - interval 34 day,
                           curdate() - interval 50 day);

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

Поэтому я добавил:

GROUP BY email_address

Это приводит только к 2 записям при выполнении запроса ... Я неправильно использую GROUP BY?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Я предполагаю, что вы хотите, чтобы записи группировались как таковые или аналогичные по группам, основываясь на том, что вы включили поле create_at:

SELECT email, GROUP_CONCAT( DISTINCT created_at ORDER BY created_at DESC ) AS list_of_dates FROM invitations GROUP BY email;

, чтобы произвести что-то вроде:

email              |  list_of_dates  
==========================================================  
jenny@hotmail.com  |  01/26/2019, 01/23/2019  
jonny@gmail.com    |  01/23/2019, 01/18/2019, 01/13/2019  
greg@yahoo.com     |  01/13/2019  

или альтернативно:

SELECT created_at, GROUP_CONCAT( DISTINCT email ORDER BY created_at DESC SEPARATOR '; ' ) AS list_of_dates FROM invitations GROUP BY created_at;

created_at  |  list_of_emails  
====================================  
01/26/2019  |  jenny@hotmail.com  
01/23/2019  |  jenny@hotmail.com; jonny@gmail.com  
01/18/2019  |  jonny@gmail.com  
01/13/2019  |  jonny@gmail.com; greg@yahoo.com  

В контексте GROUP_CONCAT (), GROUP BY является необязательным и используется для дальнейшего разбиения группировок за пределы однострочного агрегата.Если предложение GROUP BY не указано, оно объединит все в одну строку.

  • Ключевое слово DISTINCT внутри GROUP_CONCAT () должно предшествовать полям конкатенации и даст только уникальное поле.возвращаемые значения
  • Необязательный ORDER BY следует за полями конкатенации и работает так же, как в запросах SELECT
  • SEPARATOR также необязателен, но должен также следовать ORDER BY, если также используется;это позволяет вам указать присоединяющую строку, используемую при конкатенации

В зависимости от того, сколько записей / как долго может длиться конкатенация, вы можете настроить максимальное значение, установив переменную сеанса:

SET SESSION group_concat_max_len=<max length>

В любом случае - используйте GROUP BY для любого поля, которое вы хотите суммировать, и включите остальные в GROUP_CONCAT, надеюсь, это поможет.

0 голосов
/ 26 января 2019

Нет смысла делать SELECT DISTINCT email ... GROUP BY email - используйте либо DISTINCT, либо GROUP BY для достижения того же результата

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

GROUP BY используется для агрегирования данных, где некоторая комбинация столбцов одинакова. Любые другие столбцы за пределами этой комбинации должны содержаться в функции агрегирования, такой как AVG, MAX, SUM и т. Д.

Пример:

SELECT city, ethnicity, MAX(age), AVG(salary)
FROM people
GROUP BY city, ethnicity

В нем будет представлен уникальный набор пар город / этническая принадлежность, а также самый старый возраст и средняя заработная плата для группы

DISTINCT существенно менее полезен, чем GROUP BY, поскольку он не позволяет запускать функции агрегирования в других столбцах; он возвращает уникальный набор записей по всем выбранным столбцам. Я считаю это удобным эквивалентом:

SELECT DISTINCT city, ethnicity
FROM people

SELECT city, ethnicity
FROM people
GROUP BY city, ethnicity --more to type
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...