sql—如何根据mysql中的不同组更新升序位置的表?

7vhp5slm  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(250)

我正在努力解决这个复杂的问题。我想插入一些产品的订单位置。例如,我当前有一个位置为空的表1,我想对每个产品id进行分组,并基于productid group为每个大小分配一个菜单位置,并使用find \u in \u 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; 换句话说,我希望它看起来像表2。
表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

到目前为止我收集的:
产品组数量: 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") asc;

bxfogqkk

bxfogqkk1#

创建一个包含所有 Size 一列中的值和第二列中这些大小的整数顺序—称为该表 menu_pos . 把这个加入你的 Table 在大小上,生成一个表或视图(称为 product_pos )包含列 product_id , size ,和 menu_pos . 然后修改 menu_pos 值,以确保它们使用窗口函数严格按顺序排列,例如:

select
    product_id,
    size,
    rank() over (partition by product_id order by menu_pos) as new_menu_pos
from
    product_pos;

窗口函数需要mysql 8。

mnemlml8

mnemlml82#

您可以在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

相关问题