MYSQL - Синтаксис для правильного соединения моих 3 таблиц - PullRequest
0 голосов
/ 11 сентября 2018

Edit2: Выберите для разделения запросов и сопоставления / обработки информации в целом за пределами вывода базы данных. Вынуть их в формате .CSV и добавить их в Excel, где я собираюсь запустить фактические числа.

Запрос 1 для получения заказов и желаемой информации:

SELECT
shipstation_orders_v2.id AS SSO_id,
shipstation_orders_v2.order_number AS SSO_orderNumber,
shipstation_orders_v2.order_id AS SSO_orderID,
shipstation_orders_v2.storename AS SSO_storeName,
shipstation_orders_v2.order_date AS SSO_orderDate,
shipstation_orders_v2.order_total AS SSO_orderTotal,
shipstation_orders_v2.name AS SSO_name,
shipstation_orders_v2.company AS SSO_company

FROM shipstation_orders_v2

GROUP BY shipstation_orders_v2.id,
     shipstation_orders_v2.order_number,
     shipstation_orders_v2.order_id,
     shipstation_orders_v2.storename,
     shipstation_orders_v2.order_date,
     shipstation_orders_v2.order_total,
     shipstation_orders_v2.name,
     shipstation_orders_v2.company

ORDER BY SSO_orderDate

Запрос 2 для извлечения выполнений и эквивалентной информации:

SELECT DISTINCT
shipstation_orders_v2.id AS SSO_id,
shipstation_fulfillments.id AS SSF_id,
shipstation_fulfillments.order_number AS SSF_orderNumber,
shipstation_orders_v2.order_number AS SSO_orderNumber,
shipstation_orders_v2.order_id AS SSO_orderID,
shipstation_orders_v2.storename AS SSO_storeName,
shipstation_orders_v2.order_date AS SSO_orderDate,
shipstation_fulfillments.order_date AS SSF_orderDate,
shipstation_orders_v2.order_total AS SSO_orderTotal,
shipstation_fulfillments.amount_paid AS SSF_amountPaid,
shipstation_orders_v2.name AS SSO_name,
shipstation_orders_v2.company AS SSO_company,
shipstation_fulfillments.name AS SSF_name,
shipstation_fulfillments.company AS SSF_company

FROM shipstation_fulfillments

  INNER JOIN shipstation_orders_v2
  ON shipstation_fulfillments.order_number = 
  shipstation_orders_v2.order_number

WHERE shipstation_fulfillments.order_number = 
shipstation_orders_v2.order_number
  GROUP BY shipstation_orders_v2.id,
     shipstation_fulfillments.id,
     shipstation_fulfillments.order_number,
     shipstation_orders_v2.order_number,
     shipstation_orders_v2.order_id,
     shipstation_orders_v2.storename,
     shipstation_orders_v2.order_date,
     shipstation_fulfillments.order_date,
     shipstation_orders_v2.order_total,
     shipstation_fulfillments.amount_paid,
     shipstation_orders_v2.name,
     shipstation_orders_v2.company,
     shipstation_fulfillments.name,
     shipstation_fulfillments.company

Редактировать: Вопрос помечен как ответ. Я придумала другой способ сделать это, который был не таким заурядным. Реквизит в DRapp для того, чтобы заставить мой мозг двигаться.

Оригинальный код находится ниже стены текста

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

Моя проблема, когда мне нужно было представить эту третью таблицу. Очевидно, что с двумя таблицами это просто JOIN. Я понял, что работает просто отлично. У меня довольно много проблем с правильной настройкой JOINs для этой третьей таблицы.

Я пытаюсь JOIN данных от двух самых внутренних запросов к shipstation_orders_v2 и order_keys к shipstation_fulfillments результатам, которые у меня есть в третьей таблице.

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

Я делаю внутренний запрос от shipstation_orders_v2 до order_keys как способ к SELECT DISTINCT сумме разделенных заказов. У меня были проблемы с дублированием данных, прежде чем я создал этот подзапрос. С помощью (теперь) подзапроса и подзапроса проблема дублирования была устранена, и только с этими двумя таблицами она работала нормально.

Проблема в том, что когда я делаю SELECT из shipstation_fulfillments с JOIN для подзапроса и подзапроса, я сталкиваюсь с препятствиями.

Я получил несколько ошибок при работе над этим запросом. В порядке появления и разрешения:

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

Тогда ошибка 1051 для неопознанного имени таблицы shipstation_fulfillments. Мне кажется, это может быть проблемой для псевдонимов запросов. Я не уверен.

Наконец, хороший ole Error 1064, неверный синтаксис в первом подзапросе после SELECT shipstation_fulfillments аргументы.

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

Если понадобится какое-либо разъяснение, дайте мне знать.

SELECT

`shipstation_fulfillments`.`order_date` AS `orderDate`,
`shipstation_fulfillments`.`order_number` AS `orderNumber`,
(`shipstation_fulfillments`.`amount_paid` + `shipstation_fulfillments`.`tax_paid`) AS "Total Paid",
`shipstation_fulfillments`.`name` AS `name`,
`shipstation_fulfillments`.`company` AS `company`,

FROM
(
    (SELECT
        COUNT(`shipstation_orders_v2`.`order_key`) AS `orderCount`,
        `shipstation_orders_v2`.`key_id` AS `key_id`,
        `shipstation_orders_v2`.`order_number` AS `order_number`,
        MAX(`shipstation_orders_v2`.`order_date`) AS `order_date`,
        `shipstation_orders_v2`.`storename` AS `store`,
        (`shipstation_orders_v2`.`order_total` -     `shipstation_orders_v2`.`shippingPaid`) AS `orderPrice`,
        `shipstation_orders_v2`.`shippingpaid` AS `shippingPaid`,
        SUM(`shipstation_orders_v2`.`shippingpaid`) AS `SUM shippingPaid`,
        `shipstation_orders_v2`.`order_total` AS `orderTotal`,
        SUM(`shipstation_orders_v2`.`order_total`) AS `SUM Total Amount Paid`,
        `shipstation_orders_v2`.`qtyshipped` AS `qtyShipped`,
        SUM(`shipstation_orders_v2`.`qtyshipped`) AS `SUM qtyShipped`,
        `shipstation_orders_v2`.`name` AS `name`,
        `shipstation_orders_v2`.`company` AS `company`

        FROM

            (SELECT DISTINCT
                `order_keys`.`key_id` AS `key_id`,
                `order_keys`.`order_key` AS `order_key`,
                `shipstation_orders_v2`.`order_number` AS `order_number`,
                `shipstation_orders_v2`.`order_id` AS `order_id`,
                `shipstation_orders_v2`.`order_date` AS `order_date`,
                `shipstation_orders_v2`.`storename` AS `storename`,
                `shipstation_orders_v2`.`order_total` AS `order_total`,
                `shipstation_orders_v2`.`qtyshipped` AS `qtyshipped`,
                `shipstation_orders_v2`.`shippingpaid` AS `shippingpaid`,
                `shipstation_orders_v2`.`name` AS `name`,
                `shipstation_orders_v2`.`company` AS `company`
    FROM
        (`shipstation_orders_v2`
    JOIN `order_keys` ON ((`order_keys`.`order_key` = `shipstation_orders_v2`.`order_id`)))) `t`)


JOIN `shipstation_fulfillments`
ON (`shipstation_orders_v2`.`order_number` = `shipstation_fulfillments`.`order_number`)) `w`

1 Ответ

0 голосов
/ 11 сентября 2018

Как пара замечаний ... Что касается длинных имен таблиц, нет проблем, но вы можете использовать псевдонимы, ссылки на них, как я сделал в примере ... ShipStation_Fulfillments SSF ... "SSF" теперь псевдонимдля более короткого набора текста все же имеет смысл происхождения.

При изменении имен столбцов в запросе с помощью «AS» вам нужно только то, как если бы ваш результат имени столбца изменится с исходного, как это было в начале, например:SSF.order_date AS orderDate, где вы удаляете «_» из окончательного имени столбца, но также и в «Total Paid» (но я НЕНАВИЖУ имена столбцов со встроенными пробелами, позволяя пользовательскому интерфейсу обрабатывать маркировку, но это только я).

При вводе table.column (или alias.column) выполнение с помощью CamelCasing помогает удобочитаемости по сравнению с верблюдом, что затрудняет чтение, когда мозг естественным образом разбивается на читаемые слова для нас.

Другая проблема на основе запроса,Внешние части запроса не могут распознавать псевдонимы из внутренних закрытых запросов, только псевдонимы подвыбора, как у вас с псевдонимами «t» и «w».

Далее, когда я выполняю JOINs, я предпочитаю читатьих в том виде, в котором таблицы находятся в запросе, в котором перечислены первые слева, и все, что соединено с TO справа.
Если перейти от присоединения таблицы A к таблице B, предложение ON будет иметь значение ON A.KeyID =B.KeyID против B.KeyID = A.KeyID, особенно если вы собираетесь использовать несколько таблиц ... A-> B, B-> C, C-> D

Любой запрос с агрегатами (sum, avg,count, min, max и т. д.) должен содержать предложение GROUP BY, чтобы определить, когда каждая запись должна прерваться.В вашем примере я бы предположил разрыв исходного заказа на продажу.

Хотя этот запрос НЕ РАБОТАЕТ, здесь приведена очищенная версия вашего запроса, показывающая реализации сверху.

SELECT
      SSF.order_date AS OrderDate,
      SSF.order_number AS OrderNumber,
      (SSF.amount_paid + SSF.tax_paid) AS `Total Paid`,
      SSF.name,
      SSF.company
   FROM
      ( SELECT
                SSOv2.key_id,
                SSOv2.order_number,
                SSOv2.storename AS store,
                SSOv2.order_total - SSOv2.shippingPaid AS OrderPrice,
                SSOv2.ShippingPaid,
                SSOv2.order_total AS OrderTotal,
                SSOv2.QtyShipped,
                SSOv2.name,
                SSOv2.company,
                COUNT(SSOv2.order_key) AS orderCount,
                MAX(SSOv2.order_date) AS order_date,
                SUM(SSOv2.shippingpaid) AS `SUM shippingPaid`,
                SUM(SSOv2.order_total) AS `SUM Total Amount Paid`,
                SUM(SSOv2.qtyshipped) AS `SUM qtyShipped`
        FROM
            ( SELECT DISTINCT
                    OK.key_id AS key_id,
                    OK.order_key AS order_key,
                    SSOv2.order_number AS order_number,
                    SSOv2.order_id AS order_id,
                    SSOv2.order_date AS order_date,
                    SSOv2.storename AS storename,
                    SSOv2.order_total AS order_total,
                    SSOv2.qtyshipped AS qtyshipped,
                    SSOv2.shippingpaid AS shippingpaid,
                    SSOv2.name AS name,
                    SSOv2.company AS company
                 FROM
                    shipstation_orders_v2 SSOv2
                       JOIN order_keys 
                          ON SSOv2.order_id = OK.order_key
                       JOIN shipstation_fulfillments SSF
                          ON SSOv2.order_number = SSF.order_number ) t 
      ) w

Далее, не видя фактических данных или перечисленных структур, имеющих решающее значение для решения запроса, я попрошу вас отредактировать существующий пост.Создайте пример таблицы с таблицей, столбцами и образцами данных, чтобы мы могли видеть основы того, что вы собираете и пытаетесь получить из запроса.Особенно покажите, где может быть несколько строк на заказ и исполнение соответственно, и пример ответа того, что вы ОЖИДАЕТЕ, чтобы показать результаты.

...