获取行计数,其中user=$_session[';username';]


get row count where user = $_session['username']

我有一个包含列的表:(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
  • 还有另一个表叫usersUserID来自(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方法,因为它更通用,更易于实现。