Magentoテーブルからすべての顧客詳細の行を取得したい。
誰でも私にクエリを与えることができますか?
テーブルは次のとおりです。
Magento MySQL DBから一部のデータを抽出することは可能ですが、以下のクエリを実行する前に、次のことに注意してください。
1)Magentoは構成可能に構築されているため、MySQLからデータをフェッチすることはできませんが、Magento Customerモジュール(モデル、リソースモデル)とMagento構成データを使用して顧客データを取得する必要があります。ストレートクエリは、Magentoの異なるバージョンや、同じバージョンのインストールとの互換性が保証されていません。
2)Magento EAV構造では、テーブル名は属性に動的に一致するため、1つのクエリ内ですべての顧客データをNiceフォームでフェッチすることはできません。
3)1つのクエリだけで、または複数のクエリですべての顧客データを抽出することはできません。多くの情報オブジェクトはモデル内で作成され、モデルのみが1つの顧客オブジェクト内のすべてのデータを収集するロジックを持っているためです。配送先/請求先住所、ストアクレジット、ポイント(EEバージョンの場合)などについて話します。
ただし、すべての顧客のvarchar属性を取得するためだけに、次のコードを使用できます(1で前述したため、動作が保証されていません)。
SELECT ce.*, ea.attribute_code, cev.value
FROM customer_entity AS ce
LEFT JOIN eav_attribute AS ea ON ce.entity_type_id = ea.entity_type_id AND ea.backend_type = 'varchar'
LEFT JOIN customer_entity_varchar AS cev ON ce.entity_id = cev.entity_id AND ea.attribute_id = cev.attribute_id
また、このようなクエリを使用して、顧客のすべての属性を抽出することもできます。
SELECT ce.*, ea.attribute_code,
CASE ea.backend_type
WHEN 'varchar' THEN ce_varchar.value
WHEN 'int' THEN ce_int.value
WHEN 'text' THEN ce_text.value
WHEN 'decimal' THEN ce_decimal.value
WHEN 'datetime' THEN ce_datetime.value
ELSE NULL
END AS value
FROM customer_entity AS ce
LEFT JOIN eav_attribute AS ea ON ce.entity_type_id = ea.entity_type_id
LEFT JOIN customer_entity_varchar AS ce_varchar ON ce.entity_id = ce_varchar.entity_id AND ea.attribute_id = ce_varchar.attribute_id AND ea.backend_type = 'varchar'
LEFT JOIN customer_entity_int AS ce_int ON ce.entity_id = ce_int.entity_id AND ea.attribute_id = ce_int.attribute_id AND ea.backend_type = 'int'
LEFT JOIN customer_entity_text AS ce_text ON ce.entity_id = ce_text.entity_id AND ea.attribute_id = ce_text.attribute_id AND ea.backend_type = 'text'
LEFT JOIN customer_entity_decimal AS ce_decimal ON ce.entity_id = ce_decimal.entity_id AND ea.attribute_id = ce_decimal.attribute_id AND ea.backend_type = 'decimal'
LEFT JOIN customer_entity_datetime AS ce_datetime ON ce.entity_id = ce_datetime.entity_id AND ea.attribute_id = ce_datetime.attribute_id AND ea.backend_type = 'datetime'
@Stefanoの応答を補足するために、住所や電話などのその他の重要な詳細を抽出するために、大きなクエリを作成しました。これらの詳細の一部は私のデータベースでのみ意味がありますが、誰かを助けることができます:
SELECT c.entity_id,c.email,
(
SELECT fn.value
FROM customer_entity_varchar fn
WHERE c.entity_id = fn.entity_id AND
fn.attribute_id = 12) AS password_hash,
(
SELECT fn.value
FROM customer_entity_varchar fn
WHERE c.entity_id = fn.entity_id AND
fn.attribute_id = 5) AS name,
(
SELECT fn.value
FROM customer_entity_varchar fn
WHERE c.entity_id = fn.entity_id AND
fn.attribute_id = 7) AS lastname,
(
SELECT fn.value
FROM customer_entity_varchar fn
WHERE c.entity_id = fn.entity_id AND
fn.attribute_id = 150) AS cpfcnpj,
(
SELECT fn.value
FROM customer_address_entity_varchar fn
WHERE ca.entity_id = fn.entity_id AND
fn.attribute_id = 149) AS cpfcnpj2,
(
SELECT fn.value
FROM customer_address_entity_varchar fn
WHERE ca.entity_id = fn.entity_id AND
fn.attribute_id = 145) AS rg,
(
SELECT fn.value
FROM customer_address_entity_varchar fn
WHERE ca.entity_id = fn.entity_id AND
fn.attribute_id = 151) AS phone1,
(
SELECT fn.value
FROM customer_address_entity_varchar fn
WHERE ca.entity_id = fn.entity_id AND
fn.attribute_id = 31) AS phone2,
(
SELECT fn.value
FROM customer_address_entity_varchar fn
WHERE ca.entity_id = fn.entity_id AND
fn.attribute_id = 27) AS country,
(
SELECT fn.value
FROM customer_address_entity_varchar fn
WHERE ca.entity_id = fn.entity_id AND
fn.attribute_id = 28) AS state,
(
SELECT fn.value
FROM customer_address_entity_varchar fn
WHERE ca.entity_id = fn.entity_id AND
fn.attribute_id = 26) AS city,
cat.value AS address,
(
SELECT fn.value
FROM customer_address_entity_varchar fn
WHERE ca.entity_id = fn.entity_id AND
fn.attribute_id = 30) AS cep
FROM customer_entity AS c
LEFT JOIN customer_address_entity AS ca ON c.entity_id = ca.parent_id
LEFT JOIN customer_address_entity_text AS cat ON cat.entity_id = ca.entity_id
GROUP BY entity_id
これは、magentoテーブルから顧客の詳細を抽出するための小さなクエリです。
select c.*,
(select fn.value from customer_entity_varchar fn where c.entity_id = fn.entity_id and
fn.attribute_id = 5) as Name,
(select fn.value from customer_entity_varchar fn where c.entity_id = fn.entity_id and
fn.attribute_id = 7) as Lastname
from customer_entity c
上記の内容を読んだところ、問題を自分で解決しようとしている人がいることを知って、気分が良くなりました。まあ、ご存知かもしれませんが、magentoバックオフィスではクライアントに関するすべての情報を見つけることができません。すべてのクライアント(アカウント=登録済みのクライアント)(およびニュースレターnewsletter_subscribersに登録したばかりのクライアント)を表示できる非常に大きなテーブルが必要でした
Magentoがこれらの情報をどのように提供するのか本当にわからないので、データを抽出するsom SQLコードを記述しました。
上記のとおり、クライアントに関するすべての情報を1つのクエリで取得することはできません。実際には、クライアントの属性と同じ数のクエリが必要になります。エンティティクライアントに45の属性(name、lastname、middlename、email .....)がある場合、それらを抽出するために45のクエリが必要になります...私の質問はHOW ???
答えはVIEWSです!!実際、私は各属性情報を抽出するビューを書きました。つまり、45件のビューを作成し、各ビューが属性を選択することを意味します
データベースでそれがどのように行われるかはわかりませんが、各エンティティにはentity_type_idがあることを知っているかもしれません。私の場合、customer_entityとcustomer_address_entityに興味があります。 customer_entityにはentity_type_id = 1があり、customer_address_entityにはentity_type_id = 2があります
各エンティティには属性があります。したがって、顧客エンティティで使用可能な属性を確認する場合は、クエリを実行します。
Select attribute_code, attribute_id, backend_type from eav_attribute where entity_type_id =1
アドレスエンティティについても、1を2に置き換えることで同じです。
列attributes_idは非常に重要です。これにより、テーブルのidで属性を検索できるようになります。entity_customer_vachar、entity_customer_int、entity_customer_text、entity_customer_datetime ..
情報は、上記の表のタイプ別にディスパッチされます。上記のクエリを実行すると、各属性にbackendtypeがあることがわかります。つまり、探している情報は、そのタイプのサフィックスが付いたテーブルの1つです。たとえば、varchar型のfirstnameを探している場合、customer_entity_varcharなどで見つかります。
あなたがまだ読んでいるなら、それはあなたが私が話していることを理解していることを意味するかもしれません。それ以外の場合は、EAVモデルとmagento 1.3.2.4データベーススキーマを http://inchoo.net/wp-content/uploads/2010/09/MAGENTO_v1.3.2.4-Database_Diagram.pdfで確認する必要があります。
まだ準備ができていないため、ソリューション全体を投稿することはできません。それが役立つ場合は、Zipファイルを配置します。
一方、誰かがmagentoオブジェクトをphpファイルで使用して、magento Coreを編集せずにデータにアクセスする方法を知っているなら、それは素晴らしいことです!ありがとう
私は特にMagentoストアから顧客の携帯電話番号をエクスポートしようとしていました。
まず、顧客データセットに拡張されるため、データプロファイルを使用してこれを行うことができます。
私の場合、データプロファイル機能が何らかの理由で機能していなかったため、MySQLに直接アクセスしてデータを取得する理由を理解する時間がありませんでした。
次のMySQLクエリを使用すると、英国の携帯電話番号を持つ顧客を抽出できます。注:必要なデータがどのattribute_idであるかを調べ、それに応じてクエリで更新する必要がある場合があります。
attribute_id value
26 Country
19 First_Name
21 Surname
31 Telephone
クエリ:-
SELECT
`firstname`.`value` as `First_Name`,
`surname`.`value` as `Surname`,
`telephone`.`value` as `Telephone`,
`customer_entity`.`created_at`,
`customer_entity`.`updated_at`
FROM
`customer_address_entity_varchar` as `country`
INNER JOIN
`customer_address_entity_varchar` as `firstname` USING (`entity_id`)
INNER JOIN
`customer_address_entity_varchar` as `surname` USING (`entity_id`)
INNER JOIN
`customer_address_entity_varchar` as `telephone` USING (`entity_id`)
INNER JOIN
`customer_entity` USING (`entity_id`)
WHERE
`country`.`attribute_id` = 26 &&
`country`.`value`="GB" &&
`firstname`.`attribute_id` = 19 &&
`surname`.`attribute_id` = 21 &&
`telephone`.`attribute_id` = 31 &&
`telephone`.`value` LIKE "07%"
GROUP BY `telephone`.`value`
limit 0,10;
制限とwhereステートメントが結果を特定のデータに制限していることに注意してください。グループは、実際のデータが電話番号であるため、重複した番号を停止します。 INTO OUTFILEを追加して、結果セットをCSVにエクスポートできます。
これが誰かを助けることを願っています...
これまたはいくつかのMagentoコードの実際のSQLを探していますか?実際のSQLは乱雑になり、おそらく望んでいるようには見えません。
MySQLには「ピボット」がないため、実際のクエリでは基本的にeav_attribute
を無視できます。これを見て、必要な属性IDを見つけます。このデータを選択する方法の簡単な例を次に示します。
select c.*, fn.value firstname
from customer_entity c
join customer_entity_varchar fn
on c.entity_id = fn.entity_id and fn.attribute_id = 5
;
すべての属性にこれらの結合句を追加し続けると、クエリが作成されます。基本的に、EAVはこの種のアクセス用に最適化されていません。
あなたがやろうとしていることについてもう少し詳しく(またはMagentoのPHPコードがあなたの目的で機能するかどうか))を教えていただければ、さらにお手伝いできる可能性があります。
お役に立てば幸いです。
ありがとう、ジョー
SELECT customer_address_entity_varchar.value, customer_entity.entity_id
FROM customer_address_entity_varchar
LEFT JOIN customer_address_entity
ON customer_address_entity_varchar.entity_id = customer_address_entity.entity_id
LEFT JOIN customer_entity
ON customer_address_entity.parent_id = customer_entity.entity_id
WHERE attribute_id =31
属性値を取得するための別のサンプルSQLコード。私はintおよびvarchar属性のみを使用しましたが、他の属性を追加することもできます。
select c.entity_id, c.email,
a.attribute_id, a.attribute_code, a.frontend_label, a.backend_type, a.frontend_input,
case a.backend_type
when 'int' then coalesce(o.value, cei.value)
when 'varchar' then cev.value
end as value
from customer_entity c
left join eav_attribute a on a.entity_type_id = c.entity_type_id
left join customer_entity_int cei on a.backend_type = 'int' and cei.attribute_id = a.attribute_id and cei.entity_id = c.entity_id and cei.entity_type_id = c.entity_type_id
left join customer_entity_varchar cev on a.backend_type = 'varchar' and cev.attribute_id = a.attribute_id and cev.entity_id = c.entity_id and cev.entity_type_id = c.entity_type_id
left join eav_attribute_option_value o on a.backend_type = 'int' and a.frontend_input = 'select' /* and o.store_id = c.store_id */ and o.option_id = cei.value
-- where c.entity_id = 17651
having value is not null
order by c.entity_id, a.attribute_code;
これは、サブクエリのない、より単純なクエリになると思います。
SELECT c.email, cv.value as fname, cv2.value as lname
FROM customer_entity c, customer_entity_varchar cv, customer_entity_varchar cv2
WHERE c.entity_id = $user_id
AND c.entity_id = cv.entity_id
AND cv.attribute_id = 5
AND c.entity_id = cv2.entity_id
AND cv2.attribute_id = 7
Andrey Tserkusの素晴らしい答えを変更しました。そして、新しいWHERE句を追加しました。ここで製品のSKUを置き換えるだけで、製品を購入したすべての顧客レコードセットを取得できます。 Magento 1.5.1では問題なく動作します
/* 32行目のi.skuの値を、購入者から入手したい製品の対応するskuで置き換えます*/ 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') AND `e`.`entity_id` IN( SELECT DISTINCT o.customer_id FROM sales_flat_order_item i INNER JOIN sales_flat_order o ON o.entity_id = i.order_id WHERE o.customer_id IS NOT NULL AND i.sku = '10 -10-10101 -4 ' ) 制限1000
以下はMagentoで顧客の詳細を取得できるコードです
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
$customer = Mage::getSingleton('customer/session')->getCustomer();
$customerData = Mage::getModel('customer/customer')->load($customer->getId())->getData();
Mage::log($customerData);}
その出力は以下のような配列になります:-
Array
(
[entity_id] => 1
[entity_type_id] => 1
[attribute_set_id] => 0
[website_id] => 1
[email] => [email protected]
[group_id] => 1
[increment_id] => 000000001
[store_id] => 1
[created_at] => 2007-08-30 23:23:13
[updated_at] => 2008-08-08 12:28:24
[is_active] => 1
[firstname] => Test
[lastname] => User
[password_hash] => 204948a40200e4238db2277d5:eg
[prefix] =>
[middlename] =>
[suffix] =>
[taxvat] =>
[default_billing] => 274
[default_shipping] => 274
)