我正在为这个复杂的查询而苦苦挣扎。我正在尝试插入某些产品的订单位置。 例如, 我目前的表 1 的位置为 NULL,我想对每个产品 ID 进行分组,并根据 ProductID 组为每个尺寸分配一个菜单位置,并使用此 FIND_IN_SET:
FIND_IN_SET(size,"UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50 ,51,52,53,54,55,56,57,58,59,60") asc;
换句话说,我希望它看起来像 Table2。
表1
ID | ProductID | Size | Menu_position
1 | 100 | S | NULL
2 | 100 | M | NULL
3 | 100 | L | NULL
4 | 101 | 40 | NULL
5 | 101 | 41 | NULL
6 | 101 | 42 | NULL
7 | 102 | XS | NULL
8 | 102 | L | NULL
表2
ID | ProductID | Size | Menu_position
1 | 100 | S | 1
2 | 100 | M | 2
3 | 100 | L | 3
4 | 101 | 40 | 1
5 | 101 | 41 | 2
6 | 101 | 42 | 3
7 | 102 | XS | 1
8 | 102 | L | 2
到目前为止我收集到的内容:
Number of products Group:select count(distinct ProductID) from Table1
根据特定顺序对大小进行排序: SELECT * FROM Table1 ORDER BY FIND_IN_SET(size,"UNI,XS,S,M,L,XL,XXL,3XL,4XL,40 ,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60") 升序;
/p>
最佳答案
您可以在 MySQL 8.0 之前的版本中使用变量:
SELECT t1.*,
(@rn := if(@p = productid, @rn + 1,
if(@p := productid, 1, 1)
)
) as menu_position
FROM (SELECT t1.*
FROM Table1 t1
ORDER BY ProductId,
FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60') asc
) AS alias CROSS JOIN
(SELECT @p := -1, @rn := 0) params;
在 MySQL 8+ 中,这要简单得多:
select t1.*,
row_number() over (partition by productid order by FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60')) as menu_position
from table1 t1
关于mysql - 在MYSQL中如何根据不同的组更新一个升序位置的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53252030/