Лучший подход для построения сложных объединений MySQL и групп?

0

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

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

Также интересно, есть ли хорошие книги или сайты о приближении проблемы.

Теги:
join
group-by

3 ответа

1
Лучший ответ

Я не работаю в mySQL, но я часто пишу чрезвычайно сложный SQL, и вот как я к нему подхожу.

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

Затем я пытаюсь разбить задачу на куски.

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

Сначала я определяю, какая из таблиц будет содержать информацию для каждого поля в отчете. Теперь я знаю, что мне нужно будет объединить, но не совсем так, как пока.

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

Предположим, что мне нужен только один повтор на встречу (если есть несколько повторений, я хочу только основной), поэтому я проверяю, чтобы я все еще возвращал такое же количество записей, как когда у меня была только информация о собрании. Если нет, я смотрю на свои объединения и решаю, какой из них дает мне больше записей, чем мне нужно. В этом случае это может быть таблица адресов, поскольку мы храним несколько адресов для rep. Затем я корректирую запрос, чтобы получить только один. Это может быть легко (у вас может быть поле, указывающее конкретный уникальный адрес, и вам нужно только добавить условие), или вам может понадобиться выполнить некоторые функции группировки и агрегации, чтобы получить то, что вы хотите.

Затем я перехожу к следующему фрагменту (сначала работаю через все куски, которые должны иметь отношение 1-1 к центральным данным в этом случае, встреча). Runthe query nd проверяет данные после каждого добавления.

Наконец, я перехожу к тем записям, которые могут иметь отношения "один-много" и добавлять их. Снова я запускаю запрос и проверяю данные. Например, я могу проверить необработанные данные для конкретной встречи и убедиться, что мой запрос возвращается, именно то, что я ожидаю увидеть.

Предположим, что в одном из этих дополнений к соединению я обнаружил, что количество отдельных совещаний сократилось. К сожалению, в одной из таблиц, которые я только что добавил, нет данных, и мне нужно изменить их на левое соединение.

В другой раз я могу найти слишком много записей. Затем я смотрю, нужно ли иметь предложение my where для получения дополнительной информации о фильтрации или если мне нужно использовать функцию aggreagte для получения необходимых мне данных. Иногда я иногда добавляю другие поля в отчет, чтобы увидеть, могу ли я увидеть, что вызывает дублированные данные. Это помогает мне понять, что нужно отрегулировать.

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

Иногда, если я возвращаю много данных, я временно добавлю предложение additonal where в запрос, чтобы ограничить несколько элементов, которые я могу легко проверить. Я также настоятельно рекомендую использовать порядок, потому что это поможет вам понять, получаете ли вы дублированные записи.

  • 0
    Спасибо, что поделились своим подходом. Это здорово. :)
1

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

MySQL предоставляет отличные бесплатные инструменты графического интерфейса пользователя, то есть MySQL Browser Browser - это то, что вам нужно использовать.

При запуске команды EXPLAIN это сломается, как MySQL интерпретирует ваш запрос и отображает сложность. Может потребоваться некоторое время для декодирования вывода, но это другой вопрос сам по себе.

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

0

Я не использовал их сам, поэтому не могу комментировать их эффективность, но, возможно, построитель запросов на основе графического интерфейса, например dbForge или Код Factory может помочь?

И хотя использование диаграмм Венна, чтобы думать о соединениях MySQL, не обязательно помогает с SQL, они могут помочь визуализировать данные, которые вы пытаетесь отступить (см. Jeff Atwood post).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню