экспортировать уникальные записи MySQL в CSV из prestashop

0

Поэтому я пытаюсь экспортировать свою клиентскую базу из 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 и только ОДНО.

Спасибо заранее, если я сформулировал что-то неправильно или просто подумал об этом.

  • 1
    У меня есть два решения для вас (кстати, еще раз привет).
Теги:

1 ответ

1
Лучший ответ

Простое удаление соединения в адресной таблице устраняет проблему:

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}" в подзапросе - измените его на то, что мы должны упорядочить по таблице адресов, чтобы получить наиболее желательный из нескольких адресов.

Надеюсь, это поможет.

  • 1
    Еще раз спасибо, почему-то второй выдает ошибку. Я попытался отсортировать его по всем мыслимым комбинациям, и я получаю ошибки. # 1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '(разделение по порядку id_customer по a.address1 desc) AS rnum FR' в строке 21
  • 1
    Пробовал a.address1 или address1 или ps_address.address1
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню