Как получить полное имя клиента с помощью SQL?
Вопрос
Может ли кто -нибудь предоставить команду 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, чтобы присоединиться к этим данным с другими таблицами.
Редактировать: Поскольку идентификаторы атрибутов могут варьироваться, это не является общим решением для всех установок.