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

<p>у меня есть одна таблица с именем парни (id, имя, телефон), и мне нужно добавить счетчик того, сколько парней имеют одинаковые имена, и в то же время показать их все, поэтому я не могу их сгруппировать . пример:</p><pre><code>id name phone 1 john 335 2 harry 444 3 james 367 4 john 742 5 john 654 </code></pre><p>желаемый результат должен быть</p><pre><code>id name phone count 1 john 335 3 2 harry 444 1 3 james 367 1 4 john 742 3 5 john 654 3 </code></pre><p>как я мог это сделать? мне только удается собрать много парней с разным количеством.</p><p>спасибо</p>

<p>поскольку mysql не имеет <a href="http://docs.oracle.com/cd/e11882\_01/server.112/e41084/functions004.htm#sqlrf06174">аналитических функций, таких как oracle</a> , вам придется прибегнуть к подзапросу.</p><p>не используйте <code>group by</code>, используйте дополнительный выбор для подсчета количества парней с одинаковыми именами:</p><pre><code>select t.name, t.phone, (select count('x') from guys ct where ct.name = t.name) as namecounter from guys t </code></pre><p>вы могли бы подумать, что выполнение подвыбора для каждой строки будет медленным, но если у вас есть правильные индексы, mysql оптимизирует этот запрос, и вы увидите, что он работает просто отлично. </p><p>в этом примере у вас должен быть индекс <code>guys.name</code>. если у вас есть несколько столбцов в предложении <code>where</code> подзапроса, для запроса, вероятно, будет полезен единый объединенный индекс для всех этих столбцов.</p>

<p>используйте совокупный запрос:</p><pre><code>select g.id, g.name, g.phone, count(*) over ( partition by g.name ) as count from guys g; </code></pre>

<p>вы все еще можете использовать <code>group by</code> для подсчета, вам просто нужно <code>join</code> вернуть его в исходную таблицу, чтобы получить все записи, например так:</p><pre><code>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 </code></pre>

<p>в oracle db вы можете использовать</p><p><code>select id,name,phone,(select count(id)from guys group by name) from guys ;</code></p>