質問

誰でも、顧客の最初の名前と姓を1つの行で取得するSQLコマンドを提供できますか?参加した私の試みはすべて複数の行になり、次の行には1つの行に名と姓が付けられました。

役に立ちましたか?

解決

属性IDSの属性IDはMagento Instlalationによって異なるため、eav_attributeから属性_id値と姓を選択し、このような単一行で最初の名前と姓を取得するためのクエリを作成するのが賢明です。

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から完全に切り離されたものを書いている場合は、Web Services 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 値は全面的に同じです。ほとんどの場合、それらはスクリプトをインストールすることでセットアップされているためですが、「通常」と呼ばれるものではないケースを見てきました。

ここでは、名前と電子メール用です。属性_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

この場合、属性_id5は名であり、属性_id7は姓です。

トリックは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

属性ID 20および22は、最初の名前と姓を表します。また、このデータを他のテーブルに結合するために、entity_idを含めました。

編集: :属性IDは異なる可能性があるため、これはすべてのインストールの一般的なソリューションではありません。

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top