上午, 我正在尝试使用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中完成的,在大型DB产品上,它会使网站速度降低。
产品通过ID使用product_to_category和product_to_store表,类别链接到类别和商店,并使用category_to_store表链接到商店。
我想运行mySQL查询,通过将值存储在category_to_store表中来更新每个类别/商店的产品数量,因为这只需要在添加/删除/更新产品时运行,而不是每次加载任何页面时都运行。< / p>
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;
答案 0 :(得分:2)
您需要使用INNER JOIN
语法:
UPDATE
oc_category_to_store a
INNER JOIN
(
SELECT
b.category_id,
c.store_id,
COUNT(*) AS productcnt
FROM
oc_product a
INNER JOIN
oc_product_to_category b ON a.product_id = b.product_id
INNER JOIN
oc_product_to_store c ON a.product_id = c.product_id
GROUP BY
b.category_id,
c.store_id
) b ON
a.category_id = b.category_id AND
a.store_id = b.store_id
SET
a.product_count = b.productcnt
答案 1 :(得分:1)
第一个错误出现在您的查询逻辑中。您的子查询返回3列:
product_count,
p2c.category_id,
p2s.store_id
您正在尝试将此三元组分配到单个列* c2s.product_count *
更新
第二个错误位于主查询的WHERE子句中。您使用表 p2c , p2s 和 pc 但是UPDATE子句仅使用 c2s 。 WHERE子句最有可能位于子查询中,如下所示:
UPDATE
oc_category_to_store c2s
SET
c2s.product_count =
(
SELECT
count(oc_product.product_id) as product_count,
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)
WHERE
(p2c.category_id = pc.category_id) AND
(p2s.store_id = pc.store_id)
)