SQLを使用してカテゴリの完全なリストを取得する


7

sqlクエリをフォーマットして、magentoデータベースからすべてのカテゴリ(ID、名前、url_path)のリストを取得するにはどうすればよいですか。

あるいは、私がこれを実行する必要があるテーブルを知っている場合は、リストと、私が実行する必要があることについてのある種の説明が非常に役立ちます。

回答:


17

@mpaepperの回答を使用して、正しい情報を取得しているように見えるクエリを取得できました。2つの異なるmagentoデータベースでテストすることができ、それぞれが正しく見えました。とにかくここです。

  SELECT DISTINCT cc.entity_id as id, cc.value as path, cc1.value as name    
  FROM catalog_category_entity_varchar cc    
  JOIN catalog_category_entity_varchar cc1 ON cc.entity_id=cc1.entity_id    
  JOIN eav_entity_type ee ON cc.entity_type_id=ee.entity_type_id
  JOIN catalog_category_entity cce ON cc.entity_id=cce.entity_id
  WHERE cc.attribute_id = '57' AND cc1.attribute_id = '41' AND ee.entity_model = 'catalog/category'; 

おそらくeav_entity_typeに参加する必要はなかったでしょうが、おそらく別のバージョンのmagentoでこのクエリを再び使用するので、クエリを再利用可能に保つのに役立つと思います。


2
データベースに依存しないようにするには、eav_attributeテーブルに参加してattribute_idを取得することをお勧めします。attribute_codeはインストール間で同じになるため、「name」と「url_path」でattribute_codeを使用します
。IDは異なり

1
私はdb、sku、name、category_name、priceのようにエクスポートする必要があります。それを取得するにはどうすればよいですか
Gem

サブカテゴリではなくメインカテゴリのみを取得するにはどうすればよいですか?
Gem

15

さて、ここにテーブルとあなたがする必要があるものがあります(私はあなたにMySQLの参加をあなたに楽しませます;)):

catalog_category_entityカテゴリID(entity_id)を持つベーステーブルです。

あなたは、その後の属性IDを識別するために必要nameurl_pathテーブルからeav_attribute

私の場合、attribute_code namefor entity_type_id 3(私にとっては3はカテゴリーです。テーブルeav_entity_typeで調べてください)はattribute_id 41です。私の場合、attribute_code url_pathfor entity_type_id 3はattribute_id 57です。

nameurl_pathのタイプはどちらもvarcharであるため、catalog_category_entity_varchar(attribute_idおよびentity_idのフィルター、entity_idはカテゴリの対応するID)に値が表示されます。

したがって、catalog_category_entityテーブルを使用catalog_category_entity_varcharして、entity_idas結合条件で2回結合し、ルックアップできるattribute_idsを指定する必要があります。または、さらに結合を行うことができるため、以前にIDを検索せずに結合します。

楽しんで!:)


答えをありがとう、それはボールが転がるはずです。ただし、質問の1つとして、attribute_idはインストールごとに異なる可能性があるようです。attribute_idとは何かの背後にいくつかのロジックがありますか、それともランダムですか?
develophper

これを何に使用しているのかに応じて、フラットカテゴリテーブルに対して単純な選択を実行するのはどうですか?3つのデータすべてがそこにあるので、スプレッドシートを時々作成するようなもののためにこれを取得したいだけであれば、はるかに単純であり、同様に機能します。
davidalger 2014年

カテゴリ情報を使用する必要があるdrupalサイト用です。この機能は定期的に使用されるので、非常に堅牢で常に正確であることが望ましいです。
develophper

@ThomasRyan attribute_idはかなりランダムです。これは自動インクリメントキーであるため、インストールによっては、IDが大幅に異なる場合があります。
mpaepper 2014

ありがとう!あなたの答えは、私がMagentoデータベースをどのように観察すべきかを教えてくれました。
CLOUGH 2017年

5
SELECT DISTINCT cc.entity_id as category_id, cc.value as name, cc1.value as 
url_path ,cce.parent_id as parent_id ,0 as top,level as `column`,position as 
sort_order,1 as status,created_at as date_added,updated_at as date_modified 

FROM catalog_category_entity_varchar cc 
JOIN catalog_category_entity_varchar cc1 ON cc.entity_id=cc1.entity_id   
JOIN catalog_category_entity_int cc_int ON cc1.entity_id=cc_int.entity_id   
JOIN eav_entity_type ee ON cc.entity_type_id=ee.entity_type_id JOIN catalog_category_entity cce ON cc.entity_id=cce.entity_id 
WHERE cc.attribute_id in (select attribute_id from eav_attribute where attribute_code ='name') AND cc1.attribute_id in (select attribute_id from eav_attribute where attribute_code ='url_path')
and cc_int.attribute_id in (select attribute_id from eav_attribute where attribute_code ='is_active')
and cc_int.value = 1
and ((cce.parent_id = 2 and cce.children_count > 1) or cce.parent_id > 2)       
AND ee.entity_model = 'catalog/category' order by cce.parent_id asc, 
cce.position asc;

@ arun:カテゴリIDの代わりにカテゴリ名をエクスポートするには
Gem

タイトルとしてのカテゴリ名を含む@JeevaRathinam cc1.value
-r

@ arun-jamhub:SKU、カテゴリパス(名前ではなくID)をエクスポートする方法

4

すべてのメインカテゴリを取得するには、以下のクエリを使用します

select *
  from catalog_category_flat_store_1
  where level = 2 and
        is_active = 1
  order by parent_id asc, position asc;

レベルを適宜変更してください


1
これは、フラットカテゴリフラグがyesに設定されていない場合、またはID 1のWebサイトがない場合は機能しません
マリウス

@Mariusフラットがyesに設定されていない場合は正しいです。以下のようなものを使用する必要があります。selecta。*、b。* from catalog_category_entity a、catalog_category_entity_varchar b where a.entity_id = b.entity_id and b.attribute_id in(select attribute_id eav_attribute from where entity_type_id = 9 and(attribute_code = "name" or attribute_code = "image"))and level = 2 order by parent_id asc、position asc
arun-r

1

Magentoのカテゴリデータをデータベースから直接取得するには、次のようにします。

select
   p.entity_id  as entity_id,

   if(pp.level = 1,
      n.value,
      concat_ws (' / ', pn.value, n.value)) as name,

   date(p.created_at) as created_at

from
   catalog_category_entity p

   -- name
   left join catalog_category_entity_varchar n on
      p.entity_id = n.entity_id and n.attribute_id = 41

   -- status
   left join catalog_category_entity_int s on
      p.entity_id = s.entity_id and s.attribute_id = 42 and
      s.store_id = 0

   -- parent
   left join catalog_category_entity pp on p.parent_id = pp.entity_id

   -- parent name
   left join catalog_category_entity_varchar pn on
      pp.entity_id = pn.entity_id and pn.attribute_id = 41 and
      pn.store_id = 0

where
   s.value = 1 and -- status is active
   p.level >= 2 

order by
   2
;

Attribute_idはシステムごとに異なります。ここでは41と42を使用しています。

Magentoサイトからカテゴリ名とカテゴリステータスの正しいattribute_idを特定するために、以下を使用します。

select
   p.entity_id,
   a.attribute_id,
   a.frontend_label as attribute,
   av.value

from
   catalog_category_entity p

   left join catalog_category_entity_{datatype} av on
      p.entity_id = av.entity_id

   left join eav_attribute a on
      av.attribute_id = a.attribute_id

where
   p.entity_id = {eid}
;

{datatype}を「varchar」で置き換えることにより、カテゴリ名のattribute_idを取得でき、「int」でカテゴリステータスのattribute_idを取得できます。任意のカテゴリentity_idを{eid}で置き換えることができます。

これは、エディタまたはコマンドラインで、次のようにsedを使用して実行できます。

wdbが次のようにWebサイトのmysqlデータベース接続に設定されたエイリアスであると想定します。

alias wdb='mysql -h<hostname> -u<username> -p<password> <databasename>'

その後、実行できます

$ cat show_category_attr.sql | sed -e "s/{datatype}/varchar/" -e "s/{eid}/2/" | wdb -t

そして得る

+-----------+--------------+--------------+------------------+
| entity_id | attribute_id | attribute    | value            |
+-----------+--------------+--------------+------------------+
|         2 |           41 | Name         | Default Category |
|         2 |           49 | Display Mode | PRODUCTS         |
+-----------+--------------+--------------+------------------+

そして走る

$ cat show_category_attr.sql | sed -e "s/{datatype}/int/" -e "s/{eid}/2/"| wdb -t

そして得る

+-----------+--------------+----------------------------+-------+
| entity_id | attribute_id | attribute                  | value |
+-----------+--------------+----------------------------+-------+
|         2 |           42 | Is Active                  |     1 |
|         2 |           67 | Include in Navigation Menu |     1 |
+-----------+--------------+----------------------------+-------+

ここでは、必要な番号41と42を確認できます。

Magento製品にも同じ手法を使用できます。


1

Magento 2では、entity_type_idはcatalog_category_entity_varcharテーブルでは使用できないため、グーグル検索して、必要なものを取得するために中間テーブルeav_attributeを見つける必要があります。Entity_idもMagento 2のRow_Idに置き換えられます

SELECT DISTINCT cc.Row_id as category_id, cc.value as image, cc1.value as 
title ,cce.parent_id as parent_id ,0 as top,level as `column`,position as 
sort_order,1 as status,created_at as date_added,updated_at as date_modified 

FROM catalog_category_entity_varchar cc 
JOIN catalog_category_entity_varchar cc1 ON cc.Row_id=cc1.Row_id   
JOIN catalog_category_entity_int cc_int ON cc1.Row_id=cc_int.Row_id 
join eav_attribute as att on att.`attribute_id` = cc.`attribute_id`
JOIN eav_entity_type ee ON att.entity_type_id=ee.entity_type_id JOIN catalog_category_entity cce ON cc.Row_id=cce.Row_id 
WHERE cc.attribute_id in (select distinct attribute_id from eav_attribute where attribute_code ='name')
   AND cc1.attribute_id in (select attribute_id from eav_attribute where attribute_code ='url_path')
and cc_int.attribute_id in (select attribute_id from eav_attribute where attribute_code ='is_active')
and cc_int.value = 1
and ((cce.parent_id = 2 and cce.children_count > 1) or cce.parent_id > 2)       
#AND ee.entity_model = 'Magento\Catalog\Model\ResourceModel\Category'
order by cce.parent_id asc, 
cce.position asc;

必要なものを手に入れるのを手伝ってくれてありがとう。:)


0

Magento 2の場合。IDとURLパスとともにカテゴリ名の完全なリストを取得するには:

SELECT entity_id AS "CATEGORY ID", ccev1.value as "CATEGORY NAME", CONCAT(ccev2.value, ".html") AS "CATEGORY PATH"
FROM catalog_category_entity AS cce
JOIN catalog_category_entity_varchar AS ccev1 USING (entity_id)
JOIN catalog_category_entity_varchar AS ccev2 USING (entity_id)
JOIN eav_attribute AS ea1 ON ea1.attribute_id = ccev1.attribute_id
JOIN eav_attribute AS ea2 ON ea2.attribute_id = ccev2.attribute_id
WHERE ea1.attribute_code = 'name' AND ea1.entity_type_id = 3 AND ea2.attribute_code = 'url_path' AND ea1.entity_type_id = 3
ORDER BY entity_id

これはカテゴリIDで並べ替えられます。名前で並べ替える場合は、 "ORDER BY entity_id"を "ORDER BY ccev1.value"に変更します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.