【问题标题】:MySql Determine A Row Offset From a Query ResultMySql 确定查询结果的行偏移量
【发布时间】:2013-11-29 15:01:03
【问题描述】:

需要通过排序表中的列条目的值来确定行偏移的数值。

鉴于,我知道感兴趣的行中的唯一用户名 ($username)。
例如$username = "SnowWhite";

假设:保证 $username 在数据库中,并且将在我随后的初始查询的结果中。这是我的初始查询(有效):

$query  = "SELECT ALL  username,ticket_number, queue_time  FROM members WHERE queue_time !=0 ORDER BY queue_time";
$result = mysql_query($query);

有效的是对 $result 数组进行暴力 php 搜索以获取 $username 的值。

我想用一个查询(或上述查询的重铸)替换 php 搜索逻辑,该查询将用户名列的 $username 的值在 $result 内的行偏移的整数值存储到一个变量中,例如,$offset。

例如,如果 SnowWhite 位于 $result 的第三行,我希望是 $offset == 2(假设行索引偏移量从 0 开始)。

最终(这可行)我会将所选行的“ticket_number”值更新为== $offset+1。作者:

$query="update members set ticket_number='$offset+1' where username='$username'";
mysql_query($query); 

当前工作逻辑

$query  = "SELECT ALL  username,ticket_number, queue_time  FROM members WHERE queue_time !=0 ORDER BY queue_time";
$result = mysql_query($query);
$i = 0;
while ($row = mysql_fetch_array($result)) {
  if ($row[username] == $userinfo)  //-- compare usernames
     {
   ++$i;
   $query="update members set ticket_number='$i+1' where username='$userinfo'";
   mysql_query($query);
   break;
   }
++$i;
}
mysql_free_result($result);

用户名ticket_number queue_time Doc 0 0 第一个 3 不在排序结果中 脾气暴躁 0 0 快乐 0 0 Sleepy 1 111 以下是 ni 排序结果 害羞的 2 222 打喷嚏 0 333 白雪公主 ??? 444 这是当前用户(分配???=4) 笨蛋 0 555 邪恶女王 0 666

【问题讨论】:

  • 'ALL' 是默认行为,对,因此没有必要(甚至有点混乱)将其包含在此处。

标签: php mysql sql


【解决方案1】:

所以以你的表格为例:

用户名ticket_number queue_time Doc 0 0 第一个 3 不在排序结果中 脾气暴躁 0 0 快乐 0 0 Sleepy 1 111 以下是排序结果 害羞的 2 222 打喷嚏 0 333 白雪公主 ??? 444 这是当前用户(分配???=4) 笨蛋 0 555 邪恶女王 0 666

如何将值 4 分配给用户名 SnowWhite 的 ticket_number 列,4 是初始行的排序选择中该行的排名:

首先得到排序结果:

$result = mysql_query("SELECT * FROM table WHERE [here the condition for your sorted array]"); 
// don't forget to remove the []. they don't go there.
while ($row = mysql_fetch_assoc($result))
 {$array[] = $row;}

这应该会让你得到类似的东西:

[0]   [username]        [Sleepy]
      [ticket_number]   [1]
      [queue_time]      [111]
[1]   [username]        [Bashful]
      [ticket_number]   [2]
      [queue_time]      [222]
[2]   [username]        [Sneezy]
      [ticket_number]   [0]
      [queue_time]      [333]
[3]   [username]        [SnowWhite]
      [ticket_number]   [NULL]
      [queue_time]      [444]

然后遍历你的数组

    foreach ($array as $number => $row)
     {if ($row[username] == $userinfo)
       {$result = mysql_query('UPDATE table SET ticket_numer=' . ($number+1) . ' WHERE username=' . $userinfo);}}

用户名 SnowWhite 对应的行将得到 ($number + 1) (3 + 1) 作为ticket_number

【讨论】:

  • 深潜,它有两个问题(问题1)它分配'ticket_number'值==相对索引号(0,1,2,3,4)而不是相对位置排序后的数组 (1,4,2,3)。 (问题2)我认为它存储了一个字符串{我没有告诉你ticket_number是int(11)类型......在测试中我尝试了{partial} SET ticket_number ='$offset + 10'并且没有区别在从 SET ticket_number='$offset' 分配的值中
  • 对于问题 2) sql 不会添加任何内容,您必须在将其发送到 mysql 之前更改 $offset 的值: $offset = 4; $offset = $offset + 10; mysql_query("SELECT * FROM table WHERE $offset") 将导致 sql: "SELECT * FROM table WHERE 14"
  • 那么你想要的是为每一行设置 (1,4,2,3) 值的方法吗?
  • 那么这个值是多少? ARRAY 中条目之前的行数还是 DATABASE 中条目之前的行数?
  • 我只是在表格中做得更好---“编辑”我的原始问题以查看它(希望您可以编辑它)
猜你喜欢
  • 2017-06-15
  • 2013-09-12
  • 2014-07-26
  • 1970-01-01
  • 2015-10-18
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
相关资源
最近更新 更多