Pregunta

¿Alguien puede proporcionar un comando SQL que recupere el nombre y apellido de un cliente en una fila? Todos mis intentos de unión han resultado en múltiples filas, con primer nombre en una fila y apellido en la siguiente.

¿Fue útil?

Solución

Dado que los ID de atributo para el primer y el apellido varían entre las instituciones de magento, sería aconsejable seleccionar valores de Attribute_ID para el primer nombre y el apellido de EAV_ATtribute y escribir la consulta para recuperar el primer y apellido en una sola fila como esta:

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

Otros consejos

Como señaló @sonassi, realmente debería usar modelos Magento para interactuar con los datos. Agregaría que, independientemente de dónde esté su código, esto todavía es cierto. Si está escribiendo algo completamente separado de Magento, use la API de servicios web, es para lo que está ahí.

Puede obtener una colección de clientes en Magento con el nombre completo cargado en los registros individuales llamando addNameToSelect en la colección antes de cargarla:

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

Con lo anterior que se ha ejecutado, puedes llamar $collection->getSelect()->assemble() Para obtener la consulta que Magento usa:

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

Como puede ver, es una gran bestia, y reiteraré con qué abrí. A menos que esté utilizando esto para introspectar manualmente los datos, debe usar los modelos Magento para interactuar con los datos. Los intentos de evitarlos casi garantizarán que rompa la compatibilidad con diferentes versiones, ya que cosas como esta cambian. Sin embargo, el problema inmediato, no puede confiar en los valores utilizados para el attribute_id Los valores son los mismos en todos los ámbitos. La mayoría de las veces se deben a que se configuren mediante scripts de instalación, pero he visto casos en los que no son lo que se llamarían "normales".

Aquí está por nombre y correo electrónico, Attribute_ID podría no ser 5, así que cámbielo si es necesario.

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

También puede hacerlo usando una unión como esta:

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

En este caso, Attribute_ID 5 es Nombre y Attribute_ID 7 es el apellido.

Parece que el truco es usar la función 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

Los ID de atributo 20 y 22 representan el primer y apellido. También he incluido el entity_id para unir estos datos con otras tablas.

Editar: Dado que las ID de atributo pueden variar, esta no es una solución general para todas las instalaciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top