У меня есть настройка нескольких таблиц для обработки транзакций покупки онлайн. Основная таблица, из которой я получаю данные - это таблица покупательской активности. Он содержит ShipAcctID, который связывает его с таблицей адресов, и AcctID, который связывает его с таблицей пользователей. Поле AcctID является ссылкой на идентификатор учетной записи пользователя, который хранится в таблице пользователей, но мне нужно вернуть адрес доставки, который подключен в таблице адресов через поле customer_id.
Чтобы попытаться выяснить это, вот как на самом деле выглядят таблицы.
Таблица покупок
ID | PurchAmt | AcctID | ShipAddrID
================================================
1 | 30.99 | 25 | 420
2 | 45.22 | 31 | 209
Таблица пользователей
ID | Name
=================================
25 | Anastasia Beaverhausen
31 | Charles Beaverhausen
45 | Bennie Beaverhausen
Таблица адресов
ID | customer_id | name | address
==========================================================================
300 | 25 | Anastasia Beaverhausen | 123 Park Avenue
209 | 31 | Charles Beaverhausen | 500 5th Avenue
420 | 45 | Bennie Beaverhausen | 500 North Michigan Avenue
Что мне нужно сделать, это вернуть что-то вроде этого:
PurchaseID | PurchAmt | billname |billAddress |shipName | shipaddress
====================================================================================================================================
1 | 30.99 | Anastasia Beaverhausen |123 Park Avenue |Bennie Beaverhausen |500 North Michigan Avenue
Таким образом, мне нужно получить адрес электронной почты, соединив покупки по адресам с помощью отношения buyases.AcctID = address.customer_id; затем получите адрес отправителя, соединив покупки непосредственно с адресами через отношения buyases.ShipAddrID = address.id. В любом случае это имеет смысл в моей голове. Но когда я запускаю запрос, я получаю несколько строк для каждого идентификатора покупки, например:
PurchActvtyID | billName | billAddress1 |shipName | shipAddress1
==================================================================================================================================
1535 | Anastasia Beaverhausen | 123 Park Avenue |Bennie Beaverhausen | 500 North Michigan Avenue
1535 | Bennie Beaverhausen | 500 North Michigan Avenue | Bennie Beaverhausen | 500 North Michigan Avenue
Может кто-нибудь объяснить, почему это происходит? Я уверен, что это, вероятно, связано с тем, какой тип объединения использовать, но я не могу получить правильные результаты, независимо от того, какой тип я пробую. Вот мой запрос:
SELECT p.PurchActvtyID, a1.name AS billName, a1.address1 AS billAddress1, a2.name AS shipName, a2.address1 AS shipAddress1
FROM arrc_PurchaseActivity p
LEFT OUTER JOIN jos_customers_addresses a1 ON p.AcctID = a1.customer_id
LEFT OUTER JOIN jos_customers_addresses a2 ON p.ShipAddrID = a2.id
ORDER BY p.PurchActvtyID ASC
редактирует
Результаты запроса Стивена:
PurchActvtyID | billName | shipName | billAddress | shipAddress
========================================================================================
1535 | Esther Strom | Esther Strom |123 Park Avenue | 500 North Michigan Avenue
1535 | Esther Strom | Esther Strom |500 North Michigan Avenue |500 North Michigan Avenue
Причина, по которой имя отличается от того, что я показал в моем примере желаемого результата, заключается в том, что ваш запрос извлекает имя из таблицы пользователей, что не точно - имя пользователя не обязательно совпадает с Имя биллинга или доставки, связанное с данным пользователем. Вот почему мне нужно извлечь эти значения из таблицы адресов, а не из таблицы пользователей.