【问题标题】:How to clear a column value after value is added from one row to another将值从一行添加到另一行后如何清除列值
【发布时间】:2021-07-16 08:36:41
【问题描述】:

我正在使用 MySQL 作为我的数据库在 c# 中创建一个基于图块的游戏。目前,我有一个按钮网格,每次用户单击按钮时都会更新数据库。调用的方法更新表并将图块上的当前玩家设置为玩家的名称。到目前为止,我可以单击遍历许多图块并更新数据库,但它会将玩家名称放在玩家单击的每个图块上。有没有一种方法可以更新行并将列设置为值,同时从先前更新的列中删除该值?

这是我的桌子:

CREATE TABLE `tbl_tile` (
    `tileID` INTEGER NOT NULL AUTO_INCREMENT,
    `boardID` INTEGER NOT NULL,
    `tileNumber` INTEGER default null,
    `tilePlayer` varchar(100) default null,
    PRIMARY KEY (`tileID`),
    FOREIGN KEY (`boardID`) REFERENCES `tbl_board`(`boardID`) ON DELETE CASCADE 
);

这是我更新表格的过程:

drop procedure if exists UpdateDataTile; 
delimiter //
create procedure UpdateDataTile(IN `username` varchar(100), `currentTile` int)
    BEGIN
        UPDATE `tbl_tile`
        SET
        `tilePlayer` = username
        WHERE `tileID` = currentTile;

    END//
delimiter ;

这是它目前所做的:

Data results

如您所见,每次调用该过程时,该名称都会添加到一个新行中。我希望它只在当前 tileID 上显示一次名称。我相信我需要更新行并将列设置为空,但我不确定我会如何做到这一点

【问题讨论】:

  • 提供初始样本数据作为 INSERT INTO(3-5 行)。然后提供数据更改信息并显示所需的最终数据状态。
  • 我有一个简单的过程,它插入 tbl_tile 71 次,tilePlayer 的默认值为 null。在调用上述过程之前,所有行都显示为 null。然后,这会根据 currentTile 更新单行。每次 currentTile 更新时,都会调用存储过程。我试图弄清楚如何更新以前修改为空的行。期望的结果将显示有 71 行,其中一个有用户名,而其余的为 null
  • 数据结果链接有一张图片,因为我无法上传一张以我目前的声誉为背景的图片
  • 没有写答案,因为我缺乏 mysql 经验,但在 sql server 中类似于:a) 更改 WHERE 以使更新结果包括新值和以前的值 WHERE tileID = currentTile OR tilePlayer = username 和b) 更改 SET,使其同时进行清理和分配 SET tilePlayer = CASE WHEN tiIeId = currentTile THEN userName ELSE NULL END

标签: c# mysql stored-procedures


【解决方案1】:

可能的问题解释。

初始数据:

tile player
1 NULL
2 NULL
3 Jim
4 NULL
5 NULL
6 John

John 从第 6 格移动到第 4 格。需要最终状态

tile player
1 NULL
2 NULL
3 Jim
4 John
5 NULL
6 NULL

查询:

UPDATE gamedata t1
JOIN gamedata t2
SET t2.player = t1.player,
    t1.player = NULL
WHERE t1.player = 'John'  -- player name
  AND t2.player IS NULL   -- the tile to move to is empty
  AND t2.tile = 4;        -- the tile to move to

如果最终图块不为空,则不执行移动。

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=e6ce798ff6127a1b8d2c67e908ecdaef

【讨论】:

  • 正确。谢谢:)
猜你喜欢
  • 2020-05-09
  • 2021-10-25
  • 1970-01-01
  • 2022-11-11
  • 2019-11-18
  • 2018-03-04
  • 2020-09-30
  • 2021-11-23
  • 2019-11-09
相关资源
最近更新 更多