Считать без группы
У меня есть одна таблица с именем GUYS (ID, NAME, PHONE), и мне нужно добавить кол-во, сколько парней имеют одинаковое имя, и в то же время показать все из них, поэтому я не могу их сгруппировать.
Пример:
ID NAME PHONE
1 John 335
2 Harry 444
3 James 367
4 John 742
5 John 654
желаемый вывод должен быть
ID NAME PHONE COUNT
1 John 335 3
2 Harry 444 1
3 James 367 1
4 John 742 3
5 John 654 3
как я могу это сделать? Мне удается получить много парней с разным счетом.
спасибо
Ответы
Ответ 1
Так как MySQL не имеет аналитических функций, таких как Oracle, вам придется прибегнуть к подзапросу.
Не используйте GROUP BY
, используйте подвыбор, чтобы подсчитать количество парней с тем же именем:
SELECT
t.name,
t.phone,
(SELECT COUNT('x') FROM Guys ct
WHERE ct.name = t.name) as namecounter
FROM
Guys t
Можно подумать, что выполнение подвыборки для каждой строки будет медленным, но если у вас есть соответствующие индексы, MySQL будет оптимизировать этот запрос, и вы увидите, что он работает отлично.
В этом примере у вас должен быть индекс на Guys.name
. Если у вас есть несколько столбцов в предложении where
подзапроса, запрос, вероятно, выиграет от единого комбинированного индекса во всех этих столбцах.
Ответ 2
Используйте агрегированный запрос:
select g.ID, g.Name, g.Phone, count(*) over ( partition by g.name ) as Count
from
Guys g;
Ответ 3
Вы все равно можете использовать GROUP BY
для подсчета, вам просто нужно вернуть JOIN
обратно в исходную таблицу, чтобы получить все записи, например:
select g.ID, g.Name, g.Phone, gc.Count
from Guys g
inner join (
select Name, count(*) as Count
from Guys
group by Name
) gc on g.Name = gc.Name
Ответ 4
В Oracle DB вы можете использовать
SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name)
FROM GUYS ;