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で行われ、製品の大規模なDBで行われるため、サイトのクロール速度が低下します。

商品は、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 *

アップデート

2番目のエラーは、メインクエリのWHERE句にあります。テーブルp2cp2s、および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)        
        )
于 2012-07-01T08:45:45.567 に答える