Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 单查询Sql更新_Mysql - Fatal编程技术网

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
子句,好的。