1

早上,我正在尝试使用 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;
4

2 回答 2

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
于 2012-07-01T08:57:08.270 回答
1

第一个错误在您的查询逻辑中。您的子查询返回 3 列:

product_count,
p2c.category_id,
p2s.store_id

而您正试图将此三元组分配给单个列 *c2s.product_count*

更新

第二个错误出现在主查询的 WHERE 子句中。您使用表p2cp2spc 但是 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)        
        )
于 2012-07-01T08:45:45.567 回答