Подсчет «подклассов» с помощью MySQL

#mysql #sql #database #database-design

Вопрос:

Ребята, позвольте мне выразиться яснее. Я изучаю MYSQL и практикуюсь в функции «count()». У меня есть таблица под названием «Город», где у меня есть идентификатор, имя, код страны, района и населения. Моей первой идеей было узнать, сколько у меня городов по стране

SELECT *, Count(name) as "total" FROM world.city GROUP BY countrycode;

Это сработало, была создана дополнительная колонка с количеством городов по каждой стране. Я хотел бы знать, сколько у меня стран, подсчитав количество отдельных строк (я знаю, что у a есть эта информация в нижней части рабочего стола, но я хотел бы знать, чтобы эта информация отображалась в моем запросе). Я попытался добавить счетчик(код страны), но это не сработало, как я ожидал, появилось число 4079, которое является общим количеством городов, которые у меня есть. Я понял, что мой «Count()» вычисляет количество строк внутри каждой страны, не считая количества кодов, которые у меня есть для каждой страны. Возможно ли получить эту информацию?

Комментарии:

1. Ваш запрос должен выдать ошибку, так как вы выбираете все столбцы, но группируете их только по одному

2. SELECT COUNT(DISTINCT countrycode) FROM world.city

Ответ №1:

(Мини-урок для новичка.)

  • Первое, что нужно усвоить, — это COUNT(*) обычный способ использования COUNT . И вы получите количество строк. Напротив, COUNT(name) подсчитывает количество строк с ненулевыми name значениями.
  • Затем идет способ использования DISTINCT . Это не функция. Так COUNT(DISTINCT a,b) подсчитывается количество различных комбинаций a и b . И COUNT(DISTINCT(a)) хотя это работает «хорошо» и «правильно», родители лишние. Так что используйте COUNT(DISTINCT a) .
  • Не используйте * с GROUP BY собой . То есть SELECT *, ... GROUP BY ... это неправильно. Обычный способ сказать что-то вроде вашего вопроса-это

    ВЫБЕРИТЕ код страны, ПОСЧИТАЙТЕ(*) КАК «всего» ИЗ ГРУППЫ world.city ПО коду страны;

Для провинций Канады (у меня есть таблица):

 SELECT province, COUNT(*) AS "total" FROM world.canada GROUP BY province;

 --------------------------- ------- 
| province                  | total |
 --------------------------- ------- 
| Alberta                   |   573 |
| British Columbia          |   716 |
| Manitoba                  |   299 |
| New Brunswick             |   210 |
| Newfoundland and Labrador |   474 |
| Northwest Territories     |    94 |
| Nova Scotia               |   331 |
| Nunavut                   |   107 |
| Ontario                   |   891 |
| Prince Edward Island      |    57 |
| Quebec                    |  1045 |
| Saskatchewan              |   573 |
| Yukon                     |   114 |
 --------------------------- ------- 
 

Обратите внимание, что несколько городов появляются в нескольких провинциях:

 SELECT COUNT(DISTINCT city), COUNT(*) FROM world.canada;
 ---------------------- ---------- 
| COUNT(DISTINCT city) | COUNT(*) |
 ---------------------- ---------- 
|                 5248 |     5484 |
 ---------------------- ---------- 
 
  • Жуйте это; вам предстоит усвоить еще несколько уроков:
       SELECT city, COUNT(*) AS ct, GROUP_CONCAT(DISTINCT state)
               FROM world.us
               GROUP BY city
               ORDER BY COUNT(*)
               DESC LIMIT 11;
       ------------- ---- ---------------------------------- 
      | city        | ct | GROUP_CONCAT(DISTINCT state)     |
       ------------- ---- ---------------------------------- 
      | Springfield | 11 | FL,IL,MA,MO,NJ,OH,OR,PA,TN,VA,VT |
      | Clinton     | 10 | CT,IA,MA,MD,MO,MS,OK,SC,TN,UT    |
      | Madison     |  8 | AL,CT,IN,ME,MS,NJ,SD,WI          |
      | Lebanon     |  8 | IN,ME,MO,NH,OH,OR,PA,TN          |
      | Auburn      |  7 | AL,CA,IN,ME,NH,NY,WA             |
      | Burlington  |  7 | IA,MA,NC,NJ,VT,WA,WI             |
      | Washington  |  7 | DC,IL,IN,MO,NC,PA,UT             |
      | Farmington  |  7 | ME,MI,MN,MO,NH,NM,UT             |
      | Canton      |  6 | GA,IL,MA,MI,MS,OH                |
      | Monroe      |  6 | GA,LA,MI,NC,WA,WI                |
      | Lancaster   |  6 | CA,NY,OH,PA,SC,TX                |
       ------------- ---- ---------------------------------- 
     
  • Что касается количества городов в стране, то это относится к таблице Countries , а не к таблице Cities . Затем используйте a JOIN , когда вы хотите собрать их вместе.

Комментарии:

1. PS-По моим данным, в 39 странах насчитывается 57 городов с названием «Мала». И 317 Сан-Антонио в 28 странах.