Как вывести список всех отключенных продуктов с помощью sql?

15

Мне нужно перечислить все отключенные продукты с помощью запроса MySQL.

У меня слишком много продуктов в моей базе данных, чтобы использовать что-то вроде этого (создание коллекции, загрузка и циклическая обработка): http://www.srikanth.me/get-all-disabled-products-on-magento/

WebNinja
источник

Ответы:

25

В качестве продукта magento следуют структура EAV, которая

Вам нужно написать запрос между eav_attributeи catalog_product_entity_intтаблицы

Magento сохранить статус продукта на столе catalog_product_entity_intтаблицы. Сохраните это как 1 и 2.

  • 1 для включения
  • 2 для отключения.

Вам нужно получить идентификатор атрибута состояния, используя код атрибута status, в основном это 96.

Запрос:

ВЫБЕРИТЬ entity_id ОТ `catalog_product_entity_int`
ГДЕ attribute_id = (
    SELECT attribute_id ОТ `eav_attribute`
    ГДЕ `attribute_code` LIKE 'status'
) И `catalog_product_entity_int`.value = 2
Амит Бера
источник
5

Magento Query

$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

Per Amits Post - мне нужно было найти эти «отключенные» предметы (значение 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-запрос не работает, если у вас есть более одного кода атрибута с именем «status» (в моем случае у меня всего 5 строк «status») и MySQL вернет вам: #1242 - Subquery returns more than 1 rowerror.

Поэтому я завершаю SQL-запрос, добавляя source_model как 'catalog / product_status', например, так:

ВЫБЕРИТЬ entity_id ОТ `catalog_product_entity_int`
ГДЕ attribute_id = (
   SELECT attribute_id ОТ `eav_attribute`
   ГДЕ `attribute_code` LIKE 'status'
   И `source_model` LIKE 'каталог / product_status'
) И `catalog_product_entity_int`.value = 2
Klemart3D
источник