Nhận danh sách đầy đủ các danh mục bằng cách sử dụng sql


7

Làm cách nào để định dạng truy vấn sql để có danh sách tất cả danh mục (id, name và url_path) từ cơ sở dữ liệu magento của tôi.

Ngoài ra, nếu bạn biết các bảng tôi cần để làm điều này, một danh sách và một số giải thích về những gì tôi cần làm sẽ là một trợ giúp tuyệt vời.

Câu trả lời:


17

Sử dụng câu trả lời @mpaepper tôi có thể nhận được một truy vấn dường như đang kéo thông tin chính xác trở lại. Tôi đã có thể kiểm tra nó trên hai cơ sở dữ liệu magento khác nhau và mỗi cái nhìn đều đúng. Dù sao đây là nó.

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

Tôi có lẽ không cần phải tham gia eav_entity_type nhưng có lẽ tôi sẽ sử dụng lại truy vấn này trên các phiên bản khác nhau của magento vì vậy tôi nghĩ rằng điều này sẽ giúp giữ lại truy vấn.


2
Làm tốt lắm, để làm cho cơ sở dữ liệu trở nên độc lập, tôi cũng khuyên bạn nên tham gia vào bảng eav_attribution để có được property_ids. Sử dụng property_code với 'name' và 'url_path' vì thuộc tính_code sẽ giống nhau giữa các lần cài đặt, ID sẽ không :)
mpaepper

1
Tôi cần xuất từ ​​db như, sku, tên, category_name, giá, làm thế nào tôi có thể có được điều đó
Gem

Làm thế nào tôi có thể chỉ nhận được danh mục chính không phải là danh mục phụ?
Đá quý

15

Ok, đây là các bảng và những gì bạn sẽ cần phải làm (Tôi sẽ cho phép bạn tự mình tham gia MySQL;)):

catalog_category_entitylà bảng cơ sở có ID danh mục của bạn ( entity_id).

Sau đó, bạn cần xác định ID thuộc tính cho nameurl_pathtừ bảng eav_attribute.

Trong trường hợp của tôi, attribute_code namefor entity_type_id 3 (đối với tôi 3 là các danh mục, hãy tìm trong bảng eav_entity_type) có attribute_id 41. Trong trường hợp của tôi, attribute_code url_pathfor entity_type_id 3 có thuộc tính_id 57.

Cả hai nameurl_pathđều thuộc loại varchar, vì vậy bạn sẽ tìm thấy các giá trị của chúng trong catalog_category_entity_varchar(bộ lọc cho property_id và entity_id trong đó entity_id là ID tương ứng của danh mục).

Do đó, bạn cần sử dụng catalog_category_entitybảng và nối catalog_category_entity_varcharhai lần với entity_idđiều kiện nối và chỉ định thuộc tính_ids mà bạn có thể tra cứu. Ngoài ra, bạn có thể tham gia nhiều hơn, vì vậy bạn không tra cứu ID trước mà tham gia chúng.

Chúc vui vẻ! :)


hey cảm ơn cho câu trả lời, mà nên có được quả bóng lăn. Mặc dù vậy, chỉ có một câu hỏi, vì bạn có thể thấy thuộc tính_id có vẻ khác nhau cho mỗi lần cài đặt. Có một số logic đằng sau những gì thuộc tính_id hoặc là ngẫu nhiên.
triển

Tùy thuộc vào việc bạn đang sử dụng cái này để làm gì, còn việc chạy một lựa chọn đơn giản so với bảng danh mục phẳng thì sao? Tất cả 3 mẩu dữ liệu đều có ở đó, vì vậy nếu bạn chỉ muốn lấy cái này cho một cái gì đó như xây dựng bảng tính mỗi giờ và sau đó thì đơn giản hơn rất nhiều và cũng sẽ hoạt động tốt.
davidalger

đó là cho một trang web drupal cần sử dụng thông tin danh mục. Tính năng này sẽ được sử dụng thường xuyên vì vậy tôi muốn nó khá mạnh mẽ và luôn chính xác.
triển

@ThomasRyan Thuộc tính_id khá ngẫu nhiên. Đây là khóa tăng tự động, do đó tùy thuộc vào cài đặt của bạn, ID có thể khác nhau đáng kể.
mpaepper

Cảm ơn! Câu trả lời của bạn đã dạy tôi cách tôi nên quan sát cơ sở dữ liệu Magento.
ĐÁM MÂY

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: làm cách nào tôi có thể xuất tên danh mục thay vì id danh mục
Gem

@JeevaRathinam cc1.value làm tiêu đề chứa tên danh mục
arun-r

@ arun-jamhub: cách xuất sku, đường dẫn danh mục (tên không phải id)

4

Để có được tất cả các loại chính sử dụng truy vấn dưới đây

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

Thay đổi cấp độ cho phù hợp


1
Điều này không hoạt động nếu bạn không đặt cờ danh mục phẳng thành có hoặc nếu bạn không có trang web có id 1
Marius

@Marius Bạn đúng nếu căn hộ không được đặt thành có, chúng tôi phải sử dụng một cái gì đó như bên dưới, chọn a. *, B. * Từ catalog_carget_entity a, catalog_carget_entity_varchar b trong đó a.entity_id = b.entity_id và b.attribution_id in từ eav_attribution trong đó entity_type_id = 9 và (property_code = "name" hoặc property_code = "image")) và level = 2 order by Parent_id asc, vị trí asc
arun-r

1

Để lấy dữ liệu danh mục Magento trực tiếp từ cơ sở dữ liệu, tôi sử dụng:

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
;

Attribution_ids khác nhau từ hệ thống đến hệ thống. Ở đây tôi đang sử dụng 41 và 42.

Để xác định thuộc tính_ids chính xác cho tên danh mục và trạng thái danh mục từ trang Magento, tôi sử dụng:

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

Bằng cách thay thế {datatype} bằng 'varchar', bạn có thể lấy thuộc tính_id cho tên danh mục và với 'int' để lấy thuộc tính_id cho trạng thái danh mục. Bạn có thể thay thế {eid} cho bất kỳ danh mục entity_id.

Điều này có thể được thực hiện trong một trình soạn thảo hoặc trên dòng lệnh với sed như vậy:

Giả sử wdb là một bí danh được đặt cho kết nối cơ sở dữ liệu mysql trang web của bạn như thế này:

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

Sau đó bạn có thể chạy

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

Và lấy

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

Và chạy

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

Và lấy

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

Ở đây bạn có thể thấy các số cần thiết 41 và 42.

Kỹ thuật tương tự có thể được sử dụng cho các sản phẩm Magento.


1

Trong Magento 2, entity_type_id không có sẵn trong bảng catalog_carget_entity_varchar, vì vậy tôi phải google và tìm bảng trung gian, eav_attribution, để có được thứ tôi cần. Entity_id cũng được thay thế bằng Row_Id trong Magento 2

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;

Tôi muốn cảm ơn tất cả các bạn để giúp tôi có được những gì tôi cần. :)


0

Đối với Magento 2. Để có danh sách đầy đủ các tên danh mục cùng với ID và Đường dẫn URL của chúng:

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

Điều này được sắp xếp theo ID loại. Nếu bạn muốn đặt hàng nó bằng cách thay đổi tên "ORDER BY entity_id" thành "ORDER BY ccev1.value".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.