Mysql 单查询Sql更新
这个问题是我的朋友问的。他在一次采访中遇到了这个问题。请忘记数据库结构:),我想他们问这个问题是为了检查逻辑:) 下面是一个场景。有一家酒店,每个房间有不同的楼层和不同的房间号 最初的表格是这样的Mysql 单查询Sql更新,mysql,Mysql,这个问题是我的朋友问的。他在一次采访中遇到了这个问题。请忘记数据库结构:),我想他们问这个问题是为了检查逻辑:) 下面是一个场景。有一家酒店,每个房间有不同的楼层和不同的房间号 最初的表格是这样的 Floor Rooms 1 1 1 2 2 “房间”列将具有空值 我们需要使用单个查询按如下所示进行填充。这可能吗?如果是这样,我们如何才能做到这一点。请给我一些建议 Floor Rooms 1 101 1 102 1 103 2 2
Floor Rooms
1
1
1
2
2
“房间”列将具有空值
我们需要使用单个查询按如下所示进行填充。这可能吗?如果是这样,我们如何才能做到这一点。请给我一些建议
Floor Rooms
1 101
1 102
1 103
2 201
2 202
非常简单,SQL Server代码
with cte as
(
select *
,ROW_NUMBER() over (partition by fno order by fno) as rowNo
from hotel
)
update cte set rNo = fno*100 + rowNo
MySQL的代码,我只能选择,因为应该使用更新临时表,我是MySQL新手
set @type = 1;
set @num = 0;
select fno,(fno*100) + row_number as newRommNo from
(
select *
,@num := if(@type = fno, @num + 1, 1) as row_number
,@type :=fno
from hotel
) as a
试试这个
update tablename set `Rooms`=(Floor*100)+1
这可能对你有帮助 我们必须声明
标量变量:
SELECT fno, CASE WHEN fno = 1 THEN fno * 100 +@rooms :=@rooms + 1
WHEN fno = 2 THEN fno * 100 +@room :=@room + 1 END FROM hotel,
(SELECT @rooms := 0) AS w1, (SELECT @room := 0) AS w2
此处演示:如果您正在寻找真正的原子解决方案,无需在更新查询之外设置和重置会话变量,请使用此查询:
UPDATE floor_rooms
INNER JOIN (
SELECT DISTINCT floor, (@room := 0), (@floor := 0)
FROM floor_rooms
WHERE ISNULL(room)
) AS floors
ON floor_rooms.floor = floors.floor
SET floor_rooms.room =
IF(@floor = floor_rooms.floor, @room := (@room + 1), @room := 1)
+ (@floor := floor_rooms.floor) * 100;
DEMO@您可以使用游标连接两个表来执行此操作。但是在此之前,你需要有一个结构,你想一步完成吗?第二层是从201开始,而不是从204开始MySQL中没有over
子句,好的。