Как мне перечислить все магазины, категории и товары в OpenCart?

#mysql #sql #report #opencart

#mysql #sql #Сообщить #opencart

Вопрос:

Я хочу перечислить полный отчет о моем инвентаре в OpenCart.

Он должен предоставить мне все магазины, которые я настроил, все категории и все товары на одном языке. Я зарегистрировал 24 товара, но следующий запрос показывает 22 строки.

Чего мне не хватает? Пожалуйста, предложите.

 SELECT
    s.store_id,
    s.name store_name,
    s.url store_url,
    c.category_id,
    cd.name category_name,
    cd.description category_description,
    p.product_id,
    pd.name product_name,
    pd.description product_description,
    p.price,
    p.minimum,
    p.image
FROM oc_store s
INNER JOIN oc_category_to_store c2s ON c2s.store_id = s.store_id
INNER JOIN oc_product_to_store p2s ON p2s.store_id = s.store_id
INNER JOIN oc_category_description cd ON
    cd.category_id = c2s.category_id
INNER JOIN oc_category c ON c.category_id = c2s.category_id
INNER JOIN oc_product_to_category p2c ON
    p2c.category_id = c.category_id
    AND p2c.category_id = cd.category_id
    AND c.category_id = cd.category_id
INNER JOIN oc_product_description pd ON pd.product_id = p2c.product_id
INNER JOIN oc_product p ON p.product_id = pd.product_id
INNER JOIN oc_language l ON
    l.language_id = pd.language_id
    AND l.language_id = cd.language_id
WHERE
    s.store_id = 4
    AND l.language_id = 1
    AND cd.language_id = 1
    AND c.status = 1
    AND p.status = 1
    AND p.date_available < NOW()
GROUP BY p.product_id
ORDER BY
    s.name,
    cd.name,
    pd.name
;
  

SQL здесь предназначен для языка сценариев внешней оболочки, например, python, а не для каких-либо изменений в самом OpenCart / PHP.

Полезные таблицы:

 CREATE TABLE `oc_store` (
  `store_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `url` varchar(255) NOT NULL,
  `ssl` varchar(255) NOT NULL,
  PRIMARY KEY (`store_id`)
);

CREATE TABLE `oc_category_to_store` (
  `category_id` int(11) NOT NULL,
  `store_id` int(11) NOT NULL,
  PRIMARY KEY (`category_id`,`store_id`)
);

CREATE TABLE `oc_product_to_store` (
  `product_id` int(11) NOT NULL,
  `store_id` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`product_id`,`store_id`)
);

CREATE TABLE `oc_category_description` (
  `category_id` int(11) NOT NULL,
  `language_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `meta_title` varchar(255) NOT NULL,
  `meta_description` varchar(255) NOT NULL,
  `meta_keyword` varchar(255) NOT NULL,
  PRIMARY KEY (`category_id`,`language_id`),
  KEY `name` (`name`)
);

CREATE TABLE `oc_category` (
  `category_id` int(11) NOT NULL AUTO_INCREMENT,
  `image` varchar(255) DEFAULT NULL,
  `parent_id` int(11) NOT NULL DEFAULT 0,
  `top` tinyint(1) NOT NULL,
  `column` int(3) NOT NULL,
  `sort_order` int(3) NOT NULL DEFAULT 0,
  `status` tinyint(1) NOT NULL,
  `date_added` datetime NOT NULL,
  `date_modified` datetime NOT NULL,
  PRIMARY KEY (`category_id`),
  KEY `parent_id` (`parent_id`)
);

CREATE TABLE `oc_product_to_category` (
  `product_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  PRIMARY KEY (`product_id`,`category_id`),
  KEY `category_id` (`category_id`)
);

CREATE TABLE `oc_product_description` (
  `product_id` int(11) NOT NULL,
  `language_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `tag` text NOT NULL,
  `meta_title` varchar(255) NOT NULL,
  `meta_description` varchar(255) NOT NULL,
  `meta_keyword` varchar(255) NOT NULL,
  PRIMARY KEY (`product_id`,`language_id`),
  KEY `name` (`name`)
);

CREATE TABLE `oc_product` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,
  `model` varchar(64) NOT NULL,
  `sku` varchar(64) NOT NULL,
  `upc` varchar(12) NOT NULL,
  `ean` varchar(14) NOT NULL,
  `jan` varchar(13) NOT NULL,
  `isbn` varchar(17) NOT NULL,
  `mpn` varchar(64) NOT NULL,
  `location` varchar(128) NOT NULL,
  `quantity` int(4) NOT NULL DEFAULT 0,
  `stock_status_id` int(11) NOT NULL,
  `image` varchar(255) DEFAULT NULL,
  `manufacturer_id` int(11) NOT NULL,
  `shipping` tinyint(1) NOT NULL DEFAULT 1,
  `price` decimal(15,4) NOT NULL DEFAULT 0.0000,
  `points` int(8) NOT NULL DEFAULT 0,
  `tax_class_id` int(11) NOT NULL,
  `date_available` date NOT NULL,
  `weight` decimal(15,8) NOT NULL DEFAULT 0.00000000,
  `weight_class_id` int(11) NOT NULL DEFAULT 0,
  `length` decimal(15,8) NOT NULL DEFAULT 0.00000000,
  `width` decimal(15,8) NOT NULL DEFAULT 0.00000000,
  `height` decimal(15,8) NOT NULL DEFAULT 0.00000000,
  `length_class_id` int(11) NOT NULL DEFAULT 0,
  `subtract` tinyint(1) NOT NULL DEFAULT 1,
  `minimum` int(11) NOT NULL DEFAULT 1,
  `sort_order` int(11) NOT NULL DEFAULT 0,
  `status` tinyint(1) NOT NULL DEFAULT 0,
  `viewed` int(5) NOT NULL DEFAULT 0,
  `date_added` datetime NOT NULL,
  `date_modified` datetime NOT NULL,
  PRIMARY KEY (`product_id`)
);

CREATE TABLE `oc_language` (
  `language_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `code` varchar(5) NOT NULL,
  `locale` varchar(255) NOT NULL,
  `image` varchar(64) NOT NULL,
  `directory` varchar(32) NOT NULL,
  `sort_order` int(3) NOT NULL DEFAULT 0,
  `status` tinyint(1) NOT NULL,
  PRIMARY KEY (`language_id`),
  KEY `name` (`name`)
);
  

Комментарии:

1. с таким сложным запросом будет практически невозможно устранить неполадки, не зная данных, которые находятся в ваших таблицах. Если вы можете, я бы предложил создать ваши таблицы в любом sql fiddle ( sqlfiddle.com ) или скрипка db ( db-fiddle.com ) и разместите ссылку здесь, чтобы мы могли легко взглянуть на нее. Если вы не можете этого сделать, я бы начал с вашей таблицы товаров и перестроил ваш запрос шаг за шагом, добавляя каждую таблицу по одной за раз, чтобы увидеть, какая часть запроса делает это так, что вы не получаете желаемых результатов.

2. Я обновил вопрос списком полезных таблиц.

3. sqlfiddle.com /#!9/4571ce/2/0 для скрипки SQL

4. можете ли вы также предоставить некоторые примеры данных в своих таблицах, каков ваш текущий результирующий набор и как вы хотите, чтобы ваш результирующий набор возвращался?

5. Одна из причин, по которой я обнаружил, заключается в том, что некоторым продуктам не были назначены их категории.