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;
- 看到它在 sqlfiddle
中实时运行
我有 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;
- 看到它在 sqlfiddle 中实时运行