Лучший подход для построения сложных объединений MySQL и групп? - PullRequest
0 голосов
/ 07 августа 2009

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

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

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

Ответы [ 3 ]

1 голос
/ 07 августа 2009

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

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

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

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

1 голос
/ 01 сентября 2009

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

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

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

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 07 августа 2009

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

И хотя использование диаграмм Венна для анализа соединений MySQL не обязательно помогает с SQL, они могут помочь визуализировать данные, которые вы пытаетесь получить назад (см. сообщение Джеффа Этвуда ).

...