MySQL - Как подсчитать данные с 1 столбцом? [dубликат]

У меня есть запрос на выбор sql, у которого есть группа. Я хочу считать все записи после оператора group. Есть ли способ для этого непосредственно из sql? Например, имея таблицу с пользователями, я хочу выбрать разные города и общее количество пользователей

select town, count(*) from user
group by town

Я хочу иметь столбец со всеми городами, а другой с количеством пользователей во всех строки.

Примером результата для трех городов и 58 пользователей является:

Town         Count
Copenhagen   58
NewYork      58
Athens       58
181
задан 2 November 2010 в 13:48

10 ответов

Попробуйте использовать следующий код:

select ccode, count(empno) 
from company_details 
group by ccode;
0
ответ дан 15 August 2018 в 16:14
  • 1
    можете ли вы объяснить, что делает этот код. благодаря – MZaragoza 6 April 2015 в 18:51
  • 2
    мы используем этот код, чтобы узнать, сколько всего сотрудника на сегодняшний день вычисляется в каждом примере кода (код компании): count (empno) - 1839 для кода 1, а count (empno) - 9421 для кода ccode 47. – balajibran 7 April 2015 в 09:52

Вы можете использовать DISTINCT внутри COUNT, как то, что сказал Милковский

в моем случае:

select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);

Это приведет к тому, что подсчет голосов будет считаться одним и тем же user_id как один счет

2
ответ дан 15 August 2018 в 16:14

Другой способ:

/* Number of rows in a derived table called d1. */
select count(*) from
(
  /* Number of times each town appears in user. */
  select town, count(*)
  from user
  group by town
) d1
32
ответ дан 15 August 2018 в 16:14
  • 1
    alias потребности иначе не работал бы в mysql. выберите count (*) из () agr – amas 9 January 2014 в 12:54

Я знаю, что это старый пост в SQL Server:

select  isnull(town,'TOTAL') Town, count(*) cnt
from    user
group by town WITH ROLLUP

Town         cnt
Copenhagen   58
NewYork      58
Athens       58
TOTAL        174
2
ответ дан 15 August 2018 в 16:14
  • 1
    Нет ничего плохого в ответе на старые сообщения. Однако, пожалуйста, укажите объяснение своего кода, а также самого кода. – Shelvacu 15 March 2016 в 21:42
  • 2
    А эквивалент MySQL (IFNULL вместо ISNULL) приводит к разным номерам для каждого города; пользователь хотел получить общее количество. Согласно Вопросу, 58, а не 174, является суммой. – Rick James 7 July 2018 в 22:52

Вы можете использовать COUNT(DISTINCT ...):

SELECT COUNT(DISTINCT town) 
FROM user
128
ответ дан 15 August 2018 в 16:14
  • 1
    работает как прелесть ... должен быть выбран главный ответ. за исключением некоторых доказательств того, что это не хорошо. – Victor 1 September 2015 в 16:59
  • 2
    Не работает в сочетании с предложением WHERE. – Per Lindberg 2 December 2015 в 17:24
  • 3
    @PerLindberg, работает хорошо для меня. Добавить WHERE после FROM. – milkovsky 2 December 2015 в 17:31
  • 4
    Я думаю, они имеют в виду, если вы поместите COUNT (DISTINCT town) в предложение WHERE. Это связано с тем, что оно является агрегатной функцией и должно быть предусмотрено в предложении HAVING. Этот запрос SQL вводит в заблуждение для некоторых, поскольку SELECT COUNT (город DISTINCT) превращается в неявную группу GROUP BY из-за как ключевых слов COUNT, так и DISTINCT, каждое ключевое слово по своему усмотрению также будет неявно группироваться. – A. Greensmith 24 May 2016 в 09:49
  • 5
    Благодарю. Upvote. Именно то, что необходимо - group + count в одном op и получить одну строку в результате. – Green 20 September 2017 в 06:23

, если вы хотите использовать Select All Query With Count Option, попробуйте это ...

 select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name  as a where where Condition
0
ответ дан 15 August 2018 в 16:14
  • 1
    Благодарим вас за этот фрагмент кода, который может предоставить некоторую ограниченную немедленную помощь. Правильное объяснение значительно улучшит его долгосрочную ценность, показав , почему это хорошее решение проблемы и сделает его более полезным для будущих читателей с другими, аналогичными вопросов. Пожалуйста, отредактируйте свой ответ, чтобы добавить какое-то объяснение, включая сделанные вами предположения. – Toby Speight 5 December 2017 в 16:53

Десять не удаленных ответов; большинство из них не делают то, что попросил пользователь. Большинство ответов неверно читают вопрос, поскольку думают, что в каждом городе 58 пользователей, а не 58. Даже те, которые верны, не являются оптимальными.

mysql> flush status;
Query OK, 0 rows affected (0.00 sec)

SELECT  province, total_cities
    FROM       ( SELECT  DISTINCT province  FROM  canada ) AS provinces
    CROSS JOIN ( SELECT  COUNT(*) total_cities  FROM  canada ) AS tot;
+---------------------------+--------------+
| province                  | total_cities |
+---------------------------+--------------+
| Alberta                   |         5484 |
| British Columbia          |         5484 |
| Manitoba                  |         5484 |
| New Brunswick             |         5484 |
| Newfoundland and Labrador |         5484 |
| Northwest Territories     |         5484 |
| Nova Scotia               |         5484 |
| Nunavut                   |         5484 |
| Ontario                   |         5484 |
| Prince Edward Island      |         5484 |
| Quebec                    |         5484 |
| Saskatchewan              |         5484 |
| Yukon                     |         5484 |
+---------------------------+--------------+
13 rows in set (0.01 sec)

SHOW session status LIKE 'Handler%';

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Handler_commit             | 1     |
| Handler_delete             | 0     |
| Handler_discover           | 0     |
| Handler_external_lock      | 4     |
| Handler_mrr_init           | 0     |
| Handler_prepare            | 0     |
| Handler_read_first         | 3     |
| Handler_read_key           | 16    |
| Handler_read_last          | 1     |
| Handler_read_next          | 5484  |  -- One table scan to get COUNT(*)
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 15    |
| Handler_rollback           | 0     |
| Handler_savepoint          | 0     |
| Handler_savepoint_rollback | 0     |
| Handler_update             | 0     |
| Handler_write              | 14    |  -- leapfrog through index to find provinces  
+----------------------------+-------+

В контексте OP:

SELECT  town, total_users
    FROM       ( SELECT  DISTINCT town  FROM  canada ) AS towns
    CROSS JOIN ( SELECT  COUNT(*) total_users  FROM  canada ) AS tot;

это только одна строка из tot, CROSS JOIN не такая объемная, как в противном случае.

Обычный шаблон COUNT(*) вместо COUNT(town). Последнее подразумевает проверку town за то, что оно не является нулевым, что в этом контексте не нужно.

0
ответ дан 15 August 2018 в 16:14

Если вы хотите заказать по счету (звук простой, но я не могу найти ответ на стек о том, как это сделать), вы можете сделать:

        SELECT town, count(town) as total FROM user
        GROUP BY town ORDER BY total DESC
2
ответ дан 15 August 2018 в 16:14

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

SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town;
1
ответ дан 15 August 2018 в 16:14
  • 1
    Это предполагает (возможно, разумно), что нет дублирующих «пользователей». в User. – Rick James 19 July 2018 в 19:08

С Oracle вы можете использовать аналитические функции:

select town, count(town), sum(count(town)) over () total_count from user
group by town

Ваши другие параметры - использовать подзапрос:

select town, count(town), (select count(town) from user) as total_count from user
group by town
3
ответ дан 15 August 2018 в 16:14
  • 1
    что-то вроде последнего будет работать, но я хотел посмотреть, есть ли другое решение. – Stavros 28 April 2010 в 12:47
  • 2
    И вы не можете использовать первую (аналитическую функцию)? Какую платформу базы данных вы используете? – Tommi 28 April 2010 в 13:37
  • 3
    @Stavros: последний медленный – Michael Buen 28 April 2010 в 16:37

Другие вопросы по тегам:

Похожие вопросы: