Что не так с этим MySQL Query?нужна помощь, чтобы понять - PullRequest
1 голос
/ 05 апреля 2011

У меня есть 4 таблицы, а именно,

страны, штаты, города, районы,

кроме таблицы стран остальные три (штаты, города, районы) содержат внешний ключ country_id.

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

SELECT COUNT(DISTINCT(states.id)) + COUNT(DISTINCT(cities.id)) + COUNT(DISTINCT(areas.id))
FROM states
JOIN cities on cities.country_id = states.country_id
JOIN areas on areas.country_id = states.country_id
WHERE states.country_id IN (118);

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

SELECT COUNT(DISTINCT(states.id)) + COUNT(DISTINCT(cities.id)) + COUNT(DISTINCT(areas.id))

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

Однако, если я удаляю DISTINCT из строки запроса, он показывает мне другой результат, то есть счет 120, тогда как на самом деле это должно быть 15 (это число count_id_ страны во всех трех таблицах).

Вопрос 2: Что происходит, если я использовать DISTINCT и удалить DISTINCT? НЕ ДОЛЖЕН удалить какой-либо повторяющиеся значения. где дублирование здесь происходит?

спасибо ..

1 Ответ

4 голосов
/ 05 апреля 2011

Например, если в стране A (с основным идентификатором a.id = 118) существует штат B (с основным идентификатором b.id), внутри этого штата находится город C (с основным идентификатором c.id. ), В городе C есть область D (с основным идентификатором d.id), E (с основным идентификатором e.id), F (f.id) .lets визуализируют результат запроса в таблице базы данных.

C St Ct Ar


A-> B-> C-> D

A-> B-> C-> Е

A-> B-> C-> F

(Здесь C = Страна, St = Штаты, Ct = Города, Ar = Районы)

Теперь просто подумайте, что происходит, когда вы рассчитываете на приведенную выше таблицу, чтобы получить общее количество штатов в стране А без отличных. Результат равен 3, таким образом, количество городов равно 3, а областей - 3, всего 9. Потому что без Если вы получаете повторяющиеся значения, которые вас не интересуют.

Теперь, если вы используете различное количество, вы получите правильный результат, потому что здесь различные состояния под страна А - 1, город - 1, а районы - 3, всего: 5 (исключая повторяющиеся значения).

Надеюсь, это работает!

!! Проблема дизайна !!!

Как добавить что-то: из вашей базы данных я вижу, что вы используете идентификатор страны в качестве ссылки для стран из таблицы стран (для штатов, областей и городов), а затем соединяете штаты и города, затем штаты и области (по идентификатор страны) не думаете ли вы, что это создает перекрестное соединение?. Лучший выбор дизайна - это таблица областей, в которой хранится внешний ключ города, таким образом, поднимайтесь снизу вверх, как в штатах с сохранением города и в штатах с сохранением страны. Или составьте таблицу для областей где вы храните внешний ключ стран, штатов, городов и первичный ключ областей.

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