MySQL считает вхождения, но возвращает все строки - PullRequest
0 голосов
/ 26 августа 2018

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

ID |  NAME  
1     Peter 
2     Simone 
3     Otto
4     Cedric 
5     Peter 
6     Cedric
7     Cedric

Следующее возвращает только одну строку для каждого уникального имени

select id, first_name, count(first_name)from table group by first_name

ID |  FIRST_NAME  | count(first_name)
1     Peter          2
2     Simone         1
3     Otto           1
4     Cedric         3

Но я пытаюсь вернуть каждую строку, что-то вроде

ID |  FIRST_NAME  | count(first_name)
1     Peter          2
2     Simone         1
3     Otto           1
4     Cedric         3
5     Peter          2
6     Cedric         3
7     Cedric         3

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Вы можете использовать коррелированный подзапрос:

SELECT t1.id, 
       t1.first_name,
       (SELECT COUNT(id) 
        FROM table t2 
        WHERE t2.first_name = t1.first_name) AS total_count
FROM table t1
0 голосов
/ 26 августа 2018

Если вы используете версию MySQL> = 8.0, то вы можете использовать оконные функции:

select id,
       first_name,
       count(*) over (partition by first_name)
from table

Для более ранних версий:

select id,
       first_name,
       (select count(*) from table where first_name = t.first_name)
from table t
0 голосов
/ 26 августа 2018

Редактировать: теперь, когда я видел другие ответы, почему объединение лучше, чем использование коррелированного подзапроса? Потому что коррелированный подзапрос выполняется для каждой строки в вашей таблице. Когда вы присоединяетесь к нему, запрос выполняется только один раз.


Тогда вам нужно присоединиться к этим запросам.

select * from
table 
inner join (
    select first_name, count(first_name) as name_count from table group by first_name
) qcounts on table.first_name = qcounts.first_name

Также обратите внимание, что в вашем запросе вы должны удалить id из предложения select, поскольку вы не имеете его в предложении group by и не применяете к нему агрегатную функцию. Поэтому для этого столбца возвращается случайная строка.
Хорошей идеей будет позволить MySQL напомнить вам об этом, активировав режим only_full_group_by sql. Для этого вы можете сделать

set global sql_mode = concat(@@global.sql_mode, 'only_full_group_by');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...