Как правильно объединить таблицы с отношением «многие к одному» - PullRequest
0 голосов
/ 20 апреля 2019

У меня шесть таблиц

  • Основная таблица Orders - это зашифрованная таблица, содержащая заказы, сделанные клиентами.
  • Вторая таблица является хеш-таблицей для таблицы Orders. OrdersHash.
  • Остальные четыре таблицы являются таблицами хранилищ, которые имеют одинаковую структуру. StoreA, StoreB, StoreC, & StoreD.

    Таблица заказов

    код заказа | остаток строки ...

    OrdersHash Table

    код заказа | orderIdHash | остаток строки ..

    Все четыре таблицы хранилищ имеют общую структуру.

    orderIdHash | идентификатор клиента | остаток строки ..

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

enter image description here

Если я использую идентификатор customerId для Майка, я ожидаю строку 1 из таблицы Orders.

Это то, что я пробовал до сих пор.

"SELECT 

    o.dateShipped       AS orderShipped,
    o.shipped           AS shipped,
    o.recieved          AS recieved

    FROM Orders o

    JOIN OrdersHash oHash
        ON o.orderId = oHash.orderId
    JOIN StoreA a
        ON ohash.orderIdHash = a.orderIdHash
    JOIN StoreB b
        ON ohash.orderIdHash = b.orderIdHash
    JOIN StoreC c
        ON ohash.orderIdHash = c.orderIdHash
    JOIN StoreD d
        ON ohash.orderIdHash = d.orderIdHash

    WHERE
    a.customerId = :customerId1
    OR b.customerId = :customerId2
    OR c.customerId = :customerId3
    OR d.customerId = :customerId4";

** customerId 1,2,3,4 имеют одинаковое значение. Я должен использовать другое имя для привязки в PDO.

Это вернет результат, но, похоже, возвращает одну и ту же строку из Orders для каждой строки в магазине с совпадающим orderIdHash, когда мне просто нужна одна запись из таблицы Orders.

Заранее благодарю за помощь.

1 Ответ

1 голос
/ 20 апреля 2019

Кажется, вы, вероятно, хотите UNION сохранить результаты, а затем JOIN это в таблицу Orders.Используя UNION вместо UNION ALL, мы можем выбрать только отдельные значения orderIdHash, гарантируя, что мы получим только одну строку для каждого Order в таблице результатов.Как то так:

SELECT o.dateShipped       AS orderShipped,
       o.shipped           AS shipped,
       o.recieved          AS recieved
FROM (SELECT customerId, orderIdHash
      FROM (SELECT customerId, orderIdHash FROM StoreA
            UNION
            SELECT customerId, orderIdHash FROM StoreB
            UNION
            SELECT customerId, orderIdHash FROM StoreC
            UNION
            SELECT customerId, orderIdHash FROM StoreD
            ) stores
      WHERE customerId = :customerId) c
JOIN OrdersHash oHash ON oHash.orderIdHash = c.orderIdHash
JOIN Orders o ON o.orderId = oHash.orderId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...