SQL: В какой стране больше городов? - PullRequest
0 голосов
/ 27 февраля 2019

Здравствуйте. Я начал использовать MySQL, и у меня, похоже, возникают проблемы при попытке вложения формул.Я работаю над проблемой, и вопрос в том, в какой стране больше городов?

У меня есть две таблицы:

CITY:
city
city_id
country_id

COUNTRY:
country 
country_id

Я могу объединить две таблицы, чтобы получитьгорода для сравнения со странами, но после этого я не знаю, как рассчитывать на страну, в которой больше всего городов.

Мой текущий код:

SELECT city.city, country.country 
FROM city, country
WHERE city.country_id = country.country_id

Оттуда я не знаю, как добавить функцию подсчета, чтобы она не возвращалась как ошибка.Я не совсем понимаю основы вложенности.

Спасибо, любая помощь приветствуется.

Ответы [ 9 ]

0 голосов
/ 27 февраля 2019

Извините, это был мой первый пост, мой код выглядит ужасно.

повторяет мой код снова.

select
    country.country_id,
    count(city.city_id)
from
    country
inner join
    city
on
    city.country_id=country.country_id
group by
    city.country_id
having
    count(city.city_id) =
    (SELECT
        max(count(city.city_id))
    FROM
        city
    GROUP BY
        city.city_id);

С уважением,

Йенс

0 голосов
/ 12 апреля 2019
SELECT country_id, count(1)
 FROM city
 GROUP BY country_id
 ORDER BY count(1) desc;
0 голосов
/ 27 февраля 2019

Что затрудняет это, так это возможные связи, то есть две или более стран, разделяющих максимальное количество городов.Начиная с MySQL 8, вы можете использовать оконные функции, чтобы помочь вам в этом.Здесь я сравниваю количество стран и их максимум, а затем выбираю строки, в которых два совпадения.

select *
from country
where (country_id, true) in -- true means it is a maximum city country
(
  select country_id, count(*) = max(count(*)) over()
  from city
  group by country_id
);
0 голосов
/ 27 февраля 2019

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

**select
    country.country_id,
    count(city.city_id)
from
    country
inner join
    city
on
    city.country_id=country.country_id
group by
    city.country_id
having
    count(city.city_id) =
    (SELECT
        max(count(city.city_id))
    FROM
        city
    GROUP BY
        city.city_id);**

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

Гдехороший подход, однако он не работает вместе с «group by», так как он будет учитываться перед командой «group by».

Способ объединения данных из разных таблиц не совсем правильный, но эффективный.В этом случае я предлагаю использовать внутреннее объединение, чтобы сделать команду более очевидной / лучше читаемой.

Count () используется для подсчета количества городов, которые накапливаются в одной стране, max () используется для получениястрана с наибольшим количеством городов (наибольшее количество ()).

0 голосов
/ 27 февраля 2019
SELECT x.country 
  FROM country x
  JOIN city y
    ON y.country_id = x.country_id
 GROUP
    BY x.country
 ORDER 
    BY COUNT(*) DESC LIMIT 1;

В случае (фантастически маловероятного) шанса, что большинство цивилизованных стран имеют одинаковое количество городов, вам придется немного изменить это.

0 голосов
/ 27 февраля 2019

Вам не нужно делать вложение обязательно.Чтобы просто знать, в какой стране больше городов, просто используйте группу по:

select country_id, count(1)
from city
group by country_id

Это даст вам количество городов в каждой стране.Тогда вы можете использовать CTE , чтобы получить страну с наибольшим количеством городов.

0 голосов
/ 27 февраля 2019

Вы можете найти страну следующим образом:

ВЫБРАТЬ МАКС. (C.id) ОТ (ВЫБЕРИТЕ СЧЕТЧИК (id) КАК идентификатор из группы городов по country_id) c

0 голосов
/ 27 февраля 2019

Вам нужно GROUP BY, если вы хотите использовать агрегатные функции.

Учитывая тот факт, что вы новичок в этом, я думаю, вы получите гораздо больше от этого, если потратитенесколько минут, читая некоторые документы.Не волнуйтесь, это легко, так что вы поймете это в кратчайшие сроки.Пожалуйста, взгляните на следующую базовую информацию ( MySQL GROUP BY базовая информация ) относительно использования GROUP BY в MySQL.Ответы на ваши вопросы в теме «MySQL GROUP BY с агрегатными функциями».

Основная группа по:

SELECT 
    status, COUNT(*)
FROM
    orders
GROUP BY status;

Группировка с помощью объединения:

SELECT 
    status, SUM(quantityOrdered * priceEach) AS amount
FROM
    orders
        INNER JOIN
    orderdetails USING (orderNumber)
GROUP BY status;
0 голосов
/ 27 февраля 2019

Попробуйте следующий код -

SELECT *, 
  (SELECT COUNT(*) FROM cities WHERE cities.country_id=C.country_id) as cities_count 
FROM country C 
ORDER BY cities_count DESC
LIMIT 0,1

Также необходимо объединение двух таблиц?В своем запросе вы сказали, что вам нужно найти В какой стране больше городов?

Выше запроса вернет только одну страну с максимальным количеством городов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...