#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. Одна из причин, по которой я обнаружил, заключается в том, что некоторым продуктам не были назначены их категории.