Поэтому я пытаюсь экспортировать свою клиентскую базу из prestashop в magento2, prestashop хранит несколько записей, если у пользователей разные адреса, которые они отправляют и т.д.
я получу
[email protected] x3 раза при экспорте, поскольку у них несколько адресов доставки.
Я использую DISTINCT
чтобы попытаться сортировать его, но я думаю, что его использование неверно.
select DISTINCT
ps_customer.email,
'base' AS _website,
ps_customer.firstname,
ps_customer.lastname,
ps_customer.passwd AS password_hash,
ps_customer.company,
ps_customer.birthday AS dob,
ps_customer.date_add AS created_at,
ps_address.id_country,
ps_address.id_state,
ps_address.address1 AS _address_street,
ps_address.postcode AS _address_postcode,
ps_address.city AS _address_city,
ps_address.phone AS _address_telephone,
'1' AS website_id,
ps_customer.firstname AS _address_firstname,
ps_customer.lastname AS _address_lastname
from
ps_customer
INNER JOIN
ps_address ON ps_customer.id_customer=ps_address.id_customer
WHERE
ps_customer.active=1
Все данные, которые выходят, верны, мне просто нужно отображать только первую или любую запись на основе ps_customer.email и только ОДНО.
Спасибо заранее, если я сформулировал что-то неправильно или просто подумал об этом.
Простое удаление соединения в адресной таблице устраняет проблему:
select DISTINCT
ps_customer.email,
'base' AS _website,
ps_customer.firstname,
ps_customer.lastname,
ps_customer.passwd AS password_hash,
ps_customer.company,
ps_customer.birthday AS dob,
ps_customer.date_add AS created_at,
'1' AS website_id,
ps_customer.firstname AS _address_firstname,
ps_customer.lastname AS _address_lastname
from
ps_customer
WHERE
ps_customer.active=1
Но я думаю, вы, вероятно, захотели найти там адрес. В этом случае возникает вопрос: если на одного клиента есть несколько возможных адресов, и вы хотите только одного из них, как выбрать один из них? И если ответ будет таким: это произвольно, то почему мы его включаем? Возможно, есть флаг, чтобы сказать, что это первичный адрес, или это адрес фактурирования?
Это сказало:
SELECT
c.email,
'base' AS _website,
c.firstname,
c.lastname,
c.passwd AS password_hash,
c.company,
c.birthday AS dob,
c.date_add AS created_at,
a.id_country,
a.id_state,
a.address1 AS _address_street,
a.postcode AS _address_postcode,
a.city AS _address_city,
a.phone AS _address_telephone,
'1' AS website_id,
c.firstname AS _address_firstname,
c.lastname AS _address_lastname
FROM ps_customer c
INNER JOIN
(SELECT *, row_number() over (partition by id_customer order by {EDIT_THIS} desc) AS rnum
FROM ps_address
) as a ON a.id_customer = c.id_customer and a.rnum = 1
WHERE c.active=1
Обратите внимание на "{EDIT_THIS}" в подзапросе - измените его на то, что мы должны упорядочить по таблице адресов, чтобы получить наиболее желательный из нескольких адресов.
Надеюсь, это поможет.