Holen Sie sich die vollständige Liste der Kategorien mit SQL


7

Wie würde ich eine SQL-Abfrage formatieren, um eine Liste aller Kategorien (ID, Name und URL-Pfad) aus meiner Magento-Datenbank zu erhalten?

Wenn Sie die Tabellen kennen, die ich dazu benötige, wäre eine Liste und eine Erklärung, was ich tun muss, eine große Hilfe.

Antworten:


17

Mit der Antwort @mpaepper konnte ich eine Abfrage erhalten, die die richtigen Informationen zurückzieht. Ich konnte es auf zwei verschiedenen Magento-Datenbanken testen und jede sah richtig aus. Jedenfalls ist es hier.

  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'; 

Ich musste mich wahrscheinlich nicht eav_entity_type anschließen, aber ich werde diese Abfrage wahrscheinlich wieder in verschiedenen Versionen von Magento verwenden, sodass ich denke, dass dies dazu beiträgt, die Abfrage wiederverwendbar zu halten.


2
Gute Arbeit, um die Datenbank unabhängig zu machen, würde ich empfehlen, auch der Tabelle eav_attribute beizutreten, um die attribute_ids zu erhalten. Verwenden Sie attribute_code mit 'name' und 'url_path', da der attribute_code zwischen den Installationen identisch ist und die ID nicht :)
mpaepper

1
Ich muss aus DB exportieren, wie, SKU, Name, Kategorie_Name, Preis, wie kann ich das bekommen
Gem

Wie kann ich nur Hauptkategorien bekommen, keine Unterkategorien?
Gem

15

Ok, hier sind die Tabellen und was Sie tun müssen (ich lasse Sie den MySQL-Join-Spaß für sich selbst machen;)):

catalog_category_entityist die Basistabelle mit Ihrer Kategorie-ID ( entity_id).

Sie müssen dann die Attribut-IDs für nameund url_pathaus der Tabelle identifizieren eav_attribute.

In meinem Fall hat die attribute_code namefor entity_type_id 3 (für mich 3 Kategorien, schauen Sie in der Tabelle eav_entity_type nach) die attribute_id 41. In meinem Fall hat die attribute_code url_pathfor entity_type_id 3 die attribute_id 57.

Beide nameund url_pathsind vom Typ varchar, daher finden Sie ihre Werte in catalog_category_entity_varchar(Filter für attribute_id und entity_id, wobei entity_id die entsprechende ID der Kategorie ist).

Daher müssen Sie die catalog_category_entityTabelle verwenden und catalog_category_entity_varcharzweimal mit der entity_idBedingung as join verbinden und die attribute_ids angeben, nach denen Sie suchen können. Alternativ können Sie weitere Verknüpfungen durchführen, sodass Sie die IDs vorher nicht nachschlagen, sondern mitmachen.

Habe Spaß! :) :)


Hey, danke für die Antwort, die den Ball ins Rollen bringen sollte. Eine Frage, wie Sie bereits erwähnt haben, scheint jedoch, dass attribute_id pro Installation unterschiedlich sein kann. Gibt es eine Logik hinter dem Attribut_id oder ist es zufällig?
Entwicklung am

Je nachdem, wofür Sie dies verwenden, können Sie alternativ eine einfache Auswahl für die flache Kategorietabelle ausführen. Alle drei Daten sind vorhanden. Wenn Sie also nur ab und zu nach einer Tabelle suchen, ist dies viel einfacher und funktioniert genauso gut.
Davidalger

Es ist für eine Drupal-Site, die die Kategoriedaten verwenden muss. Diese Funktion wird regelmäßig verwendet, daher möchte ich, dass sie recht robust und immer genau ist.
Entwicklung am

@ThomasRyan Die attribute_id ist ziemlich zufällig. Da es sich um einen Auto-Inkrement-Schlüssel handelt, können sich die IDs je nach Installation erheblich unterscheiden.
Mpaepper

Vielen Dank! Ihre Antwort hat mich gelehrt, wie ich die Magento-Datenbank beobachten soll.
CLOUGH

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: Wie kann ich Kategorienamen anstelle von Kategorie-ID exportieren
Gem

@JeevaRathinam cc1.value als Titel enthält Kategorienamen
arun-r

@ arun-jamhub: wie man sku exportiert, Kategoriepfad (Name nicht ID)

4

Verwenden Sie die folgende Abfrage, um alle Hauptkategorien abzurufen

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

Ändern Sie die Stufe entsprechend


1
Dies funktioniert nicht, wenn Sie das Flag für flache Kategorien nicht auf Ja gesetzt haben oder wenn Sie keine Website mit der ID 1 haben
Marius

@Marius Sie haben Recht, wenn flat nicht auf yes gesetzt ist. Wir müssen Folgendes verwenden: Wählen Sie a. *, B. * Aus catalog_category_entity a, catalog_category_entity_varchar b aus, wobei a.entity_id = b.entity_id und b.attribute_id in (select attribute_id) von eav_attribute wobei entity_type_id = 9 und (attribute_code = "name" oder attribute_code = "image")) und level = 2 order by parent_id asc, position asc
arun-r

1

Um Magento-Kategoriedaten direkt aus der Datenbank abzurufen, verwende ich Folgendes:

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_ids unterscheiden sich von System zu System. Hier benutze ich 41 und 42.

Um die richtigen Attribut-IDs für den Kategorienamen und den Kategoriestatus von einer Magento-Site zu ermitteln, verwende ich:

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}
;

Indem Sie {datatype} durch 'varchar' ersetzen, können Sie die attribute_id für den Kategorienamen und mit 'int' die attribute_id für den Kategoriestatus abrufen. Sie können jede Kategorie entity_id durch {eid} ersetzen.

Dies kann in einem Editor oder in der Befehlszeile mit sed wie folgt erfolgen:

Angenommen, wdb ist ein Alias ​​für die MySQL-Datenbankverbindung Ihrer Website wie folgt:

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

Dann kannst du rennen

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

Und bekomme

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

Und Renn

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

Und bekomme

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

Hier sehen Sie die notwendigen Nummern 41 und 42.

Die gleiche Technik kann für Magento-Produkte verwendet werden.


1

In Magento 2 ist entity_type_id in der Tabelle catalog_category_entity_varchar nicht verfügbar. Daher muss ich googeln und die Zwischentabelle eav_attribute suchen, um das zu erhalten, was ich benötige. Entity_id wird in Magento 2 auch durch Row_Id ersetzt

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;

Ich möchte Ihnen allen danken, damit ich das bekomme, was ich brauche. :) :)


0

Für Magento 2. So erhalten Sie eine vollständige Liste der Kategorienamen mit ihren IDs und URL-Pfaden:

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

Dies ist nach Kategorie-ID sortiert. Wenn Sie es nach Namen bestellen möchten, ändern Sie "ORDER BY entity_id" in "ORDER BY ccev1.value".

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.