早上,我正在尝试使用 UPDATE、JOIN、SUBQUERY 为每个类别/商店创建产品计数,但我无法正确使用语法,有人可以帮我解决哪里出错:
UPDATE
oc_category_to_store c2s
SET
c2s.product_count =
(
SELECT
count(p.product_id) as product_count,
p2c.category_id,
p2s.store_id
FROM
oc_product p
INNER JOIN oc_product_to_category p2c ON
(p.product_id = p2c.product_id)
INNER JOIN oc_product_to_store p2s ON
(p.product_id = p2s.product_id)
) AS pc
WHERE
(p2c.category_id = pc.category_id) AND
(p2s.store_id = pc.store_id)
本质上这是在 OpenCart 中,但现有的产品计数例程是在 PHP 中完成的,是在大型产品数据库上,它会减慢网站的速度。
产品使用 product_to_category 和 product_to_store 表通过 ID 链接到类别和商店,类别也使用 category_to_store 表链接到商店。
我想运行一个 mySQL 查询,通过将值存储在 category_to_store 表中来更新每个类别/商店的产品计数,因为这只需要在添加/删除/更新产品时运行,而不是每次加载任何页面时运行。
CREATE TABLE `oc_product_to_category` (
`product_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
PRIMARY KEY (`product_id`,`category_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AVG_ROW_LENGTH=9 ROW_FORMAT=FIXED;
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`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AVG_ROW_LENGTH=9 ROW_FORMAT=FIXED;
CREATE TABLE `oc_category_to_store` (
`category_id` int(11) NOT NULL,
`store_id` int(11) NOT NULL,
`product_count` int(11) DEFAULT NULL,
PRIMARY KEY (`category_id`,`store_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AVG_ROW_LENGTH=9 ROW_FORMAT=FIXED;