Как получить полное имя клиента с помощью SQL?

magento.stackexchange https://magento.stackexchange.com/questions/506

  •  16-10-2019
  •  | 
  •  

Вопрос

Может ли кто -нибудь предоставить команду SQL, которая извлекает имя клиента и фамилию в одном ряду? Все мои попытки объединить привели к нескольким рядам с именем в одном ряду и фамилией в следующем.

Это было полезно?

Решение

Поскольку идентификаторы атрибутов для имени и фамилии варьируются между инсталаляциями Magento, было бы целесообразно выбрать значения attribute_id для имени и фамилии от eav_attribute и написать запрос для получения имени имени и фамилии в одном ряду:

SELECT entity_id, group_concat(VALUE SEPARATOR ' ') AS fullname 
FROM customer_address_entity_varchar AS val
INNER JOIN eav_attribute AS attr ON attr.attribute_id  = val.attribute_id
WHERE attr.attribute_code IN ( 'firstname',  'lastname' ) 
GROUP BY entity_id

Другие советы

Как отметил @sonassi, вы действительно должны использовать модели Magento для взаимодействия с данными. Я бы добавил это независимо от того, где находится ваш код, это все еще верно. Если вы пишете что -то полностью отделенное от Magento, то используйте API веб -сервисов, это то, для чего оно есть.

Вы можете получить коллекцию клиентов в Magento с полным именем, загруженным на отдельные записи, позвонив addNameToSelect в коллекции перед загрузкой:

$collection = Mage::getResourceModel('customer/customer_collection')
    ->addNameToSelect()
    ->setPageSize(20)
    ->load()
;

С учетом вышесказанного, вы можете позвонить $collection->getSelect()->assemble() Чтобы получить запрос, который использует Magento:

SELECT
    `e`.*,
    `at_prefix`.`value` AS `prefix`,
    `at_firstname`.`value` AS `firstname`,
    `at_middlename`.`value` AS `middlename`,
    `at_lastname`.`value` AS `lastname`,
    `at_suffix`.`value` AS `suffix`,
    CONCAT(IF(at_prefix.value IS NOT NULL AND at_prefix.value != '',
                CONCAT(LTRIM(RTRIM(at_prefix.value)), ' '),
            ''),
            LTRIM(RTRIM(at_firstname.value)), ' ',
            IF(at_middlename.value IS NOT NULL AND at_middlename.value != '',
                CONCAT(LTRIM(RTRIM(at_middlename.value)), ' '),
            ''),
            LTRIM(RTRIM(at_lastname.value)),
            IF(at_suffix.value IS NOT NULL AND at_suffix.value != '',
                CONCAT(' ', LTRIM(RTRIM(at_suffix.value))),
            '')
        ) AS `name`
FROM `customer_entity` AS `e`
    LEFT JOIN `customer_entity_varchar` AS `at_prefix` ON (`at_prefix`.`entity_id` = `e`.`entity_id`) AND (`at_prefix`.`attribute_id` = '4')
    LEFT JOIN `customer_entity_varchar` AS `at_firstname` ON (`at_firstname`.`entity_id` = `e`.`entity_id`) AND (`at_firstname`.`attribute_id` = '5')
    LEFT JOIN `customer_entity_varchar` AS `at_middlename` ON (`at_middlename`.`entity_id` = `e`.`entity_id`) AND (`at_middlename`.`attribute_id` = '6')
    LEFT JOIN `customer_entity_varchar` AS `at_lastname` ON (`at_lastname`.`entity_id` = `e`.`entity_id`) AND (`at_lastname`.`attribute_id` = '7')
    LEFT JOIN `customer_entity_varchar` AS `at_suffix` ON (`at_suffix`.`entity_id` = `e`.`entity_id`) AND (`at_suffix`.`attribute_id` = '8')
WHERE (`e`.`entity_type_id` = '1') LIMIT 20

Как видите, это довольно зверь, и я снова буду повторять то, с чем открыл. Если вы не используете это для вручную, индивидуализации данных, вы должны использовать модели Magento для взаимодействия с данными. Попытки избежать их почти гарантируют, что вы нарушаете совместимость с различными версиями, так как подобные вещи меняются. Непосредственная проблема, вы не можете полагаться на значения, используемые для attribute_id Значения одинаковы по всем направлениям. Большую часть времени они будут из -за того, что они будут настроены на установленные сценарии, но я видел случаи, когда они не являются тем, что называется «нормальными».

Здесь это для имени и электронной почты, ATTRIBUTE_ID может быть не 5, поэтому измените его, если это необходимо.

SELECT cev.value AS first_name,  ce.email AS email
FROM  `product_alert_stock` AS pas
LEFT JOIN  `customer_entity` AS ce ON pas.customer_id = ce.entity_id
LEFT JOIN  `customer_entity_varchar` AS cev ON pas.customer_id = cev.entity_id
WHERE cev.attribute_id =5
GROUP BY pas.alert_stock_id
SELECT entity_id, group_concat(VALUE SEPARATOR ' ') AS fullname 
FROM customer_entity_varchar AS val
INNER JOIN eav_attribute AS attr ON attr.attribute_id  = val.attribute_id
WHERE attr.attribute_code IN ( 'firstname',  'lastname' ) 
GROUP BY entity_id

Вы также можете сделать это, используя соединение, как это:

SELECT first.entity_id,CONCAT(first.value,' ',last.value) FROM `customer_entity_varchar` first 
INNER JOIN customer_entity_varchar last ON first.entity_id = last.entity_id AND last.attribute_id = 7 
WHERE first.attribute_id = 5

В этом случае attruitule_id 5 является именем, а ATTRIBUTE_ID 7 - фамилия.

Кажется, хитрость заключается в том, чтобы использовать функцию MySQL Group_Concat:

SELECT entity_id, group_concat(VALUE SEPARATOR ' ') AS fullname 
FROM `customer_address_entity_varchar` 
WHERE attribute_id IN (20,22) 
GROUP BY entity_id

Идентификаторы атрибутов 20 и 22 представляют первое и фамилию. Я также включил entity_id, чтобы присоединиться к этим данным с другими таблицами.

Редактировать: Поскольку идентификаторы атрибутов могут варьироваться, это не является общим решением для всех установок.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top