如何在mysql中为每个组赋予相同的值

时间:2019-02-05 04:38:38

标签: mysql sql

我从昨天开始就无法创建mysql查询。我有一个像下面的桌子车:-

 id     material_code
  1         ABC100
  2         DEF200
  3         ABC100
  4         ABC100
  5         DEF200

材料代码将长16位,我已将其取小以更好地理解。我想在下面输出类似这样的内容:-

 id     material_code   item_number
  1         ABC100         1
  2         DEF200         2
  3         ABC100         1
  4         ABC100         1
  5         DEF200         2

如您所见, ABC100 在重复,因此它的item_number为1, DEF200 为2,依此类推。谁能帮助我实现这一目标?我在Google上搜索未找到任何内容。

4 个答案:

答案 0 :(得分:1)

对于低于8的MySQL版本,您可以使用变量来模拟ROW_NUMBER()的功能。此处的子查询根据material_code是否与上一行相同来分配项目编号,并处理按material_code排序的数据。然后,我们SELECT再次查询子查询中的所有内容,并再次按id进行排序。

SELECT id, material_code, item_number
FROM (SELECT id, 
             @i := (CASE WHEN @m = material_code THEN @i ELSE @i + 1 END) AS item_number,
             @m := material_code AS material_code
      FROM carts
      JOIN (SELECT @m := '', @i := 0) v
      ORDER BY material_code) c
ORDER BY id

输出:

id  material_code   item_number
1   ABC100          1
2   DEF200          2
3   ABC100          1
4   ABC100          1
5   DEF200          2

Demo on dbfiddle

答案 1 :(得分:0)

您可以尝试2种选择。

  1. 不要使用关键字Distinct-当对select查询使用distinct时,结果将删除重复的行。

    选择id,material_number, 案件  当material_number ='ABC100'然后1  当material_number ='DEF200'时2 结束为item_number 从表1

  2. 如果获得两个表的并集,则可以使用Union All而不是Union。因为Union All不会删除重复的行。

    选择id,material_number, 案件  当material_number ='ABC100'然后1  当material_number ='DEF200'时2 结束为item_number 从表1 联合所有 选择id,material_number, 案件  当material_number ='ABC100'然后1  当material_number ='DEF200'时2 结束为item_number 从table2

答案 2 :(得分:0)

如果mysql版本为8+,则可以使用解析函数rank()

select id, material_code, rank() over (partition by material_code order by material_code) as itemNumber from table;

答案 3 :(得分:0)

材料

id(Auto Increment)     material_code
1                      ABC100
2                      DEF200

购物车

id     material_code
1         ABC100
2         DEF200
3         ABC100
4         ABC100
5         DEF200

查询

SELECT c.id, c.material_code, m.id AS item_number FROM cart AS c JOIN material AS m ON c.material_code = m.material_code