MySQL 查询 - 使用 order/count 更新字段,但基于另一个字段再次从 1 开始

MySQL Query - Update field with order/count but start at 1 again based on another field

我有 table 种产品。此 table 是使用 SELECT from X ORDER by Y 查询创建的。我想添加顺序行数或顺序 (1,2,3..)。

但是,我希望在产品类别或供应商更改时将此计数重置为 1。 (在查询产品类别和供应商的组合时,我最终会得到一个排序依据)。

这个问题是与一个更大的问题相关的子问题的简化。因此,涉及 php 的其他解决方案不相关。

这是一个示例 table:

+--------------+------------------+-----------+-----------+
| product_name | product_category | vendor_id | sortorder |
+--------------+------------------+-----------+-----------+
| Product 1    | A                |         1 |         0 |
| Product 2    | A                |         1 |         0 |
| Product 3    | A                |         1 |         0 |
| Product 4    | B                |         1 |         0 |
| Product 5    | B                |         1 |         0 |
| Product 6    | C                |         2 |         0 |
| Product 7    | C                |         2 |         0 |
| Product 8    | C                |         2 |         0 |
| Product 9    | C                |         2 |         0 |
| Product 10   | C                |         2 |         0 |
+--------------+------------------+-----------+-----------+

如果查询 运行 成功,它应该是这样的:

+--------------+------------------+-----------+-----------+
| product_name | product_category | vendor_id | sortorder |
+--------------+------------------+-----------+-----------+
| Product 1    | A                |         1 |         1 |
| Product 2    | A                |         1 |         2 |
| Product 3    | A                |         1 |         3 |
| Product 4    | B                |         1 |         1 |
| Product 5    | B                |         1 |         2 |
| Product 6    | C                |         2 |         1 |
| Product 7    | C                |         2 |         2 |
| Product 8    | C                |         2 |         3 |
| Product 9    | C                |         2 |         1 |
| Product 10   | C                |         2 |         1 |
+--------------+------------------+-----------+-----------+

我尝试了很多与此答案相关的不同查询,主要是尝试从初始查询中获得此结果,但无济于事: Using LIMIT within GROUP BY to get N results per group?

我可以 运行 这样的查询来得到它的顺序 1,2,3,10):

SET @pos = 0;
UPDATE testtable SET sortorder = ( SELECT @pos := @pos + 1 );

但是,这并没有完成我想要的,这是当 'product_category' 在产品 3 和产品 4 之间变化时从 1 重新开始的计数。

语法错误,这就是我想要做的:

SET @pos = 0;
UPDATE testtable SET sortorder =  
// { if (product_category != [last product_category] 
// OR
// if (vendor_id != [last vendor_id])
// }
// THEN SET sortorder = 1
// ELSE SET sortorder = (1+ [last sortorder]
;

一如既往的感谢...

EDIT-9.12.2016

尝试@Fancypants 的解决方案。实际上,起初它似乎不起作用,但它与 "product_name" 字段排序顺序有关。它将产品 10 放在产品 5 之前(1 在 5 之前)。一旦我通过使用整数字段来解决这个问题,结果就是完美的。

我假设您想要的结果有误。产品 9 和 10 的排序顺序应该是 4 和 5,对吗?

你可以这样做:

UPDATE t
JOIN (

    SELECT
    t.*
    , @rc := IF(@prevpc != product_category OR @prevv != vendor_id, 1, @rc + 1) AS so
    , @prevpc := product_category
    , @prevv := vendor_id
    FROM
    t
    , (SELECT @prevpc := NULL, @prevv := NULL, @rc := 0) var_init_subquery
    ORDER BY product_category, vendor_id, product_name

) sq ON t.product_name = sq.product_name
SET t.sortorder = sq.so;