我有一个包含列的表:(ID, UserID, Slot, ItemID, Quant)
假设我有一行值:('1', '10', '2', '35', '200');
此行的槽值为2。我在库存选项卡上有二十个插槽。我想按升序插入数据。有没有一种方法可以写一个查询,检查是否使用了最后一个插槽,以便将项目分配到下一个插槽?所以如果槽2已经被使用,那么下一个项目将消耗槽3。
或者有没有一种方法可以将多个变量与一个数值进行比较,而不必像那样让两个变量都等于这个数字
if($var1 or $var2 or $var3 == 1) {
excute this code
}
而不是执行以下操作:
if($var1 ==1) {
execute code
}
if($var2 == 1) {
execute code
}
if($var3 == 1) {
execute code
}
我不想成为坏消息的传播者,但IMHO你的数据模型已经从根本上被破坏了。有两种可能的情况:
-
如果且仅当您从未需要访问单个插槽,即如果插槽是一个封闭实体,则应存储序列化的插槽结构。
-
如果您需要对单个插槽进行任何访问,我希望通过让一个表
slots
和另一个表通过可连接来使用它来解决这样的问题。然后可以通过重复INSERT
来简化使用插槽,直到不再发生密钥冲突(当然还有更有效的方法)
编辑
为了回应@Stoic的请求,下面是关于第二个要点的详细说明:假设如下:
- OQ中的表称为
useritems
- 还有另一个表叫
users
,UserID
来自(PK) - 假设存在另一个名为
items
的表,其中ItemID
来自(PK)
现在我们创建一个表userslots
CREATE TABLE userslots (
UserID int, -- possibly some FK,
SlotNum int,
ItemId int, -- possibly some FK,
ItemCount int,
-- possibly more, as the game logic needs (Styling, etc.)
PRIMARY KEY(UserID, SlotNUm),
)
我们为其中每个用户的每个插槽创建一行,SlotNum=0..N,ItemID=ItemCount=0-这也为我们提供了让不同用户拥有不同数量插槽的可能性。
现在,如果我们想插入一个项目,我们需要两个步骤:
- 也许USer已经有了这样的项目,我们只需要增加数量?CCD_ 11。如果这返回1个受影响的行,我们就完成了
如果没有,我们需要使用一个新的插槽:
UPDATE userslots SET ItemID=$ItemID, ItemCount=1 WHERE UserID=$UserID and ItemCount=0 LIMIT 1
。如果我们需要删除一个项,我们只需要
UPDATE userslots SET ItemCount=ItemCount-1 WHERE UserID=$UserID and ItemID=$ItemID and ItemCount>0 LIMIT 1
,受影响的行数(0或1)原子地向我们显示,如果用户有这样的项:没有与另一个会话的竞争,这可能会导致双倍的消耗。
在SQL中至少有一种方法是:
SELECT max(slot) FROM table_name;
然后你们可以从结果集中提取出来,然后插入到下一个槽中。
对于if问题:
if($var1 == 1 || $var2 == 1 || $var3 == 1) {
do_something();
}
您可以使用SQL的max
函数来检查列的最后一个最大值,如下所示:
SELECT max(slot) FROM table_name;
然后,对于这些条件,您可以使用以下任一项:
$matrix = array($var1, $var2, $var3);
if (in_array(1, $matrix) {
execute_code();
}
或者,
if ($var1 == 1 || $var2 == 1 || $var3 == 1) {
execute_code();
}
我个人更喜欢in_array
方法,因为它更通用,更易于实现。