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

时间:2013-12-08 14:52:56

标签: php sql

我有一个包含列的表:(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
}

3 个答案:

答案 0 :(得分:1)

我不想成为坏消息的承载者,但恕我直言,你的数据模型从根本上被打破了。有两种可能的情况:

  • 如果且仅 从未需要访问单个插槽,即如果插槽是封闭实体,则应存储序列化插槽结构

  • 如果你需要访问单个插槽,我希望通过一个表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 - 这也让我们有可能让不同的用户拥有不同数量的插槽。

现在,如果我们要插入一个项目,我们将分两步:

  • 也许美国人已经有这样的项目,我们只需要增加点数? UPDATE userslots SET ItemCount=ItemCount+1 WHERE UserID=$UserID and ItemID=$ItemID LIMIT 1。如果这返回1个受影响的行,我们就完成了。
  • 如果没有,我们需要使用新的广告位:UPDATE userslots SET ItemID=$ItemID, ItemCount=1 WHERE UserID=$UserID and ItemCount=0 LIMIT 1

  • 如果我们需要移除一个Item,我们只需UPDATE userslots SET ItemCount=ItemCount-1 WHERE UserID=$UserID and ItemID=$ItemID and ItemCount>0 LIMIT 1,受影响的行数(0或1)会原子显示我们,如果用户有这样的项目:没有与另一个竞争会议,这可能会导致双重消费。

答案 1 :(得分:-1)

在SQL中至少有一种方法是:

SELECT max(slot) FROM table_name;

然后你可以从结果集中提取出来,然后插入下一个插槽。

对于if问题:

if($var1 == 1 || $var2 == 1 || $var3 == 1) {
  do_something();
}

答案 2 :(得分:-1)

您可以使用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方法,因为它更通用,更容易实现。