Question

Quelqu'un peut-il fournir une commande SQL qui récupère le premier et le nom de famille d'un client dans une ligne? Toutes mes tentatives de jointures ont abouti à plusieurs lignes, avec un prénom en une ligne et un nom de famille dans le suivant.

Était-ce utile?

La solution

Étant donné que les ID d'attribut pour le premier et le nom de famille varient entre Magento Instlalations, il serait sage de sélectionner les valeurs Attribute_ID pour le prénom et le nom de famille de EAV_ATTRIBUT et d'écrire la requête pour récupérer le prénom et le nom de famille dans une seule ligne comme celle-ci:

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

Autres conseils

Comme l'a souligné @Sonassi, vous devriez vraiment utiliser des modèles Magento pour interagir avec les données. J'ajouterais cela, peu importe où est votre code, cela est toujours vrai. Si vous écrivez quelque chose de complètement détaché de Magento, utilisez l'API Web Services, c'est pour quoi il est là.

Vous pouvez obtenir une collection de clients à Magento avec le nom complet chargé sur les enregistrements individuels en appelant addNameToSelect sur la collection avant de le charger:

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

Avec ce qui précède ayant été exécuté, vous pouvez alors appeler $collection->getSelect()->assemble() Pour obtenir la requête que Magento utilise:

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

Comme vous pouvez le voir, c'est tout à fait une bête, et je vais réitérer avec ce que j'ai ouvert. Sauf si vous l'utilisez pour introspecter manuellement les données que vous devriez utiliser les modèles Magento pour interagir avec les données. Les tentatives de les éviter garantiront presque que vous rompez la compatibilité avec différentes versions, car des choses comme celle-ci changent. Le problème immédiat cependant, vous ne pouvez pas compter sur les valeurs utilisées pour le attribute_id Les valeurs sont les mêmes dans tous les domaines. La plupart du temps, ils seront dus à être configurés par installer des scripts, mais j'ai vu des cas où ils ne seraient pas ce qu'on appellerait «normal».

Ici, c'est pour le nom et le courrier électronique, Attribute_id peut ne pas être 5, alors changez-le si nécessaire.

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

Vous pouvez également le faire en utilisant une jointure comme ceci:

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

Dans ce cas, Attribute_id 5 est le prénom et attribut_id 7 est le nom de famille.

Il semble que l'astuce consiste à utiliser la fonction 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

Les ID d'attribut 20 et 22 représentent le premier et le nom de famille. J'ai également inclus l'entité_id afin de rejoindre ces données avec d'autres tables.

Éditer: Étant donné que les ID d'attribut peuvent varier, ce n'est pas une solution générale pour toutes les installations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top