Як перелічити всі продукти з обмеженими можливостями за допомогою sql?


15

Мені потрібно перерахувати всі відключені продукти, використовуючи запит MySQL.

У моїй базі даних є занадто багато продуктів, щоб використовувати щось подібне (створювати колекцію, завантажувати її та перебирати на ній): http://www.srikanth.me/get-all-disabled-products-on-magento/

Відповіді:


26

Як продукт магенто слід використовувати структуру EAV, що

Вам потрібно написати Запит між eav_attributeта catalog_product_entity_intтаблицею

Magento збереже статус продукту на столі catalog_product_entity_intтаблиці. Збережіть це як 1 і 2.

  • 1 для включення
  • 2 для відключення.

Вам потрібно отримати ідентифікатор атрибуту статусу за допомогою коду атрибута status, в основному це 96.

Запит:

ВИБІРТЕ сутність_id ВІД `каталог_продукту_Світ_Інт. '
WHERE attribute_id = (
    SELECT attribute_id FROM `eav_attribute`
    ДЕ `статус attribute_code` LIKE '
) AND `catalog_product_entity_int`.value = 2

5

Запит Magento

$productsCollection = Mage::getModel('catalog/product')->getCollection()
                    ->addAttributeToFilter('status', 2); // added enabled

Mysql Query

SELECT `e`.*, IF(at_status.value_id > 0, at_status.value, at_status_default.value) AS `status` 
FROM `catalog_product_entity` AS `e` 
INNER JOIN `catalog_product_entity_int` AS `at_status_default` 
 ON (`at_status_default`.`entity_id` = `e`.`entity_id`)
  AND (`at_status_default`.`attribute_id` = '96') 
  AND `at_status_default`.`store_id` = 0 
LEFT JOIN `catalog_product_entity_int` AS `at_status` 
 ON (`at_status`.`entity_id` = `e`.`entity_id`) 
  AND (`at_status`.`attribute_id` = '96') 
  AND (`at_status`.`store_id` = 1) 
WHERE (IF(at_status.value_id > 0, at_status.value, at_status_default.value) = '2')

0

За публікацію Amits - мені потрібно було знайти елементи "інвалідів" (значення 2). Ось поточний запит mysql з кількома додатковими полями, за допомогою яких я намагався знімати, які продукти насправді потрібно "Включити"

select
  `eav_attribute`.`attribute_id` AS `attribute_id`,
  `catalog_product_entity_int`.`entity_id` AS `entity_id`,
  `catalog_product_entity_int`.`value` AS `value`,
  `eav_attribute`.`attribute_code` AS `attribute_code`,
  `catalog_product_entity`.`sku` AS `sku`,
  `catalog_product_entity`.`created_at` AS `created_at`,
  `catalog_product_entity`.`updated_at` AS `updated_at`
from
  ((`eav_attribute`
  join `catalog_product_entity_int` on ((`eav_attribute`.`attribute_id` = `catalog_product_entity_int`.`attribute_id`)))
  join `catalog_product_entity` on ((`catalog_product_entity_int`.`entity_id` = `catalog_product_entity`.`entity_id`)))
where
  ((`eav_attribute`.`attribute_code` = 'status') and
  (`catalog_product_entity_int`.`value` = 2));

2
Фабіан ... Дякую за форматування. Набагато простіше використовувати іншим.
Девід Г. Варела

0

Відповідь @Amit Bera найкраща, але запит SQL не працює, якщо у вас є більше одного коду атрибута з назвою "статус" (у моєму випадку у мене всього 5 рядків "статусу"), і MySQL поверне вам: #1242 - Subquery returns more than 1 rowпомилка.

Тож я завершую SQL-запит, додаючи source_model як 'каталог / product_status', як це працює:

ВИБІРТЕ сутність_id ВІД `каталог_продукту_Світ_Інт. '
WHERE attribute_id = (
   SELECT attribute_id FROM `eav_attribute`
   ДЕ `статус attribute_code` LIKE '
   І каталог `source_model` LIKE '/ product_status'
) AND `catalog_product_entity_int`.value = 2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.