Frage

Kann jemand einen SQL -Befehl geben, der den ersten und Nachnamen eines Kunden in einer Zeile abruft? Alle meine Versuche, Verbindungen zu erzielen, haben zu mehreren Zeilen geführt, wobei der Vorname in einer Zeile und nach dem Nachnamen in der nächsten.

War es hilfreich?

Lösung

Da Attribut -IDs für den ersten und Nachnamen zwischen Magento -Instonationen variieren, wäre es ratsam, die Werte für Attribute_ID für Vorname und Nachname von EAV_ATTRIBUT auszuwählen und die Abfrage zum Abrufen von First and Nachname in einer einzelnen Zeile wie dieser zu schreiben:

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

Andere Tipps

Wie @sonassi betonte, sollten Sie wirklich Magento -Modelle verwenden, um mit den Daten zu interagieren. Ich würde hinzufügen, dass dies unabhängig davon, wo Ihr Code ist, dies immer noch zutrifft. Wenn Sie etwas, das völlig von Magento abgelöst wurde, dann die Web Services -API verwenden, ist es das, wofür es da ist.

Sie können eine Sammlung von Kunden in Magento erhalten, wobei der vollständige Name auf den einzelnen Datensätzen geladen wird addNameToSelect Auf der Sammlung vor dem Laden:

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

Wenn das oben genannte ausgeführt wurde, können Sie dann anrufen $collection->getSelect()->assemble() Um die Abfrage zu erhalten, die Magento verwendet:

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

Wie Sie sehen können, ist es ein ziemliches Tier, und ich werde das wiederholen, mit dem ich geöffnet habe. Sofern Sie dies nicht für manuell introspektieren, sollten Sie die Magento -Modelle verwenden, um mit den Daten zu interagieren. Versuche, sie zu vermeiden, garantieren fast, dass Sie die Kompatibilität mit unterschiedlichen Versionen brechen, da sich solche Dinge ändern. Das unmittelbare Problem kann sich jedoch nicht auf die für die verwendeten Werte verlassen attribute_id Werte sind über die Tafel gleich. Meistens werden sie darauf zurückzuführen sein, dass sie durch Installationskripte eingerichtet werden, aber ich habe Fälle gesehen, in denen sie nicht "normal" genannt werden würden.

Hier ist es für Name und E -Mail, Attribute_id ist möglicherweise nicht 5, also ändern Sie es bei Bedarf.

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

Sie können es auch mit einem Join wie folgt tun:

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 diesem Fall ist Attribute_id 5 Vorname und Attribute_id 7 ist Nachname.

Es scheint der Trick zu sein, die MySQL -Funktion zu verwenden 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

Attribut -IDs 20 und 22 stellen den ersten und Nachnamen dar. Ich habe auch das entity_id aufgenommen, um diese Daten mit anderen Tabellen zu verbinden.

Bearbeiten: Da Attribut -IDs variieren können, ist dies keine allgemeine Lösung für alle Installationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top