it-swarm.com.ru

считать без группы

У меня есть одна таблица с именем ПАРНИ (ID, ИМЯ, ТЕЛЕФОН), и мне нужно добавить счетчик того, сколько парней имеют одинаковые имена, и в то же время показать их все, поэтому я не могу их сгруппировать . Пример:

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

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

спасибо

20
east

Поскольку 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 подзапроса, для запроса, вероятно, будет полезен единый объединенный индекс для всех этих столбцов.

22
GolezTrol

Используйте совокупный запрос:

select g.ID, g.Name, g.Phone, count(*) over ( partition by g.name ) as Count
from 
Guys g;
20
Sowmia Naraynan

Вы все еще можете использовать 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
10
RedFilter

В Oracle DB вы можете использовать

SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name) FROM GUYS ;

0
Sayantan Dey