我从昨天开始就无法创建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上搜索未找到任何内容。
答案 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
答案 1 :(得分:0)
您可以尝试2种选择。
不要使用关键字Distinct-当对select查询使用distinct时,结果将删除重复的行。
选择id,material_number, 案件 当material_number ='ABC100'然后1 当material_number ='DEF200'时2 结束为item_number 从表1
如果获得两个表的并集,则可以使用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