Domanda

Qualcuno può fornire un comando SQL che recupera il nome e il cognome di un cliente in una riga? Tutti i miei tentativi di join hanno portato a più righe, con nome in una riga e cognome nel prossimo.

È stato utile?

Soluzione

Poiché gli ID attributi per il nome e il cognome variano tra Magento Instalations, sarebbe saggio selezionare i valori Attribute_ID per il nome e il cognome da EAV_ATTRIBUTE e scrivere la query per il recupero del nome e del cognome in una singola riga come questa:

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

Altri suggerimenti

Come ha sottolineato @Sonassi, dovresti davvero usare i modelli Magento per interagire con i dati. Vorrei aggiungere che, indipendentemente da dove sia il tuo codice, questo è ancora vero. Se stai scrivendo qualcosa di completamente distaccato da Magento, allora usa l'API dei servizi Web, è quello per cui è lì.

Puoi ottenere una raccolta di clienti a Magento con il nome completo caricato sui singoli record chiamando addNameToSelect Sulla raccolta prima di caricarlo:

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

Con quanto sopra è stato eseguito, puoi quindi chiamare $collection->getSelect()->assemble() Per ottenere la domanda che 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

Come puoi vedere, è piuttosto una bestia e ribaderò ciò con cui ho aperto. A meno che tu non stia usando questo per introspettare manualmente i dati, dovresti utilizzare i modelli Magento per interagire con i dati. I tentativi di evitarli garantiranno quasi di rompere la compatibilità con versioni diverse, poiché cose come questa cambiano. Il problema immediato, tuttavia, non è possibile fare affidamento sui valori utilizzati per il attribute_id Valori essendo gli stessi su tutta la linea. Il più delle volte saranno dovuti al fatto che sono stati configurati dagli script di installazione, ma ho visto casi in cui non sono quelli che sarebbero chiamati "normali".

Qui è per nome ed e -mail, Attribute_id potrebbe non essere 5, quindi cambialo se necessario ..

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

Puoi anche farlo usando un join come questo:

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

In questo caso, Attribute_ID 5 è nome e attributo_id 7 è cognome.

Sembra che il trucco sia usare la funzione 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

Gli ID attributi 20 e 22 rappresentano il nome e il cognome. Ho anche incluso Entity_id per unirsi a questi dati con altre tabelle.

Modificare: Poiché gli ID attributi possono variare, questa non è una soluzione generale per tutte le installazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top