根据旧列

时间:2016-07-13 07:13:36

标签: php mysql

  ID   |  PID  |    NAME   |  VALUE  |
-------------------------------------
  60   |   1   |   Test1   |  9999   |
  21   |   2   |   Test2   |  9999   |
  44   |   1   |   Test3   |  9999   |
  37   |   4   |   Test4   |  9999   |
  24   |   1   |   Test5   |  9999   |
嘿所有人! 我是PHP和DB的新手,所以我真的不知道如何从这开始。 所以我想要在ID过多的DB中进行排序。 (这意味着第一个ID以34开头,下一个ID是43,接下来是55等。)

我有一张类似上面的表格。

现在我想要做的是根据PID中的值更改VALUE列中的值。

这意味着如果在PID中值等于1,则同一行上的VALUE应变为1001,而下一个中的VALUE应变为1002,下一个1003。 如果PID = 2,则VALUE应更改为2001年,然后是2002年,然后是2003年等。 这将是一个已经存在的表,但我还想在每次向该表添加一个新语句时包含VALUE值。 所以简单检查一下伪代码:

如果PID等于1 然后检查VALUE列,查看以" 1"开头的最高编号。 将它设为+1并将其添加到该行的列中

这可能吗? 你们会建议我做些什么(让事情变得更容易)? 如果您需要进一步的信息,请告诉我,我会尝试更好地解释,我不知道我的解释是否说明了我想要做的事情。

提前谢谢。

干杯, ķ。

1 个答案:

答案 0 :(得分:1)

您可以使用UPDATE .. JOIN并加入包含每个ID的“排名”的派生表,并相应地更新:

UPDATE YourTable t
JOIN(SELECT s.ID,s.PID,COUNT(*) as cnt
     FROM YourTable s
     JOIN YourTable s2
      ON(s.pid = s2.pid AND s.id >= s2.id)) p
 ON(t.id = p.id)          
SET t.value = (1000*t.pid) + p.cnt

这里的内部查询基本上通过自联接“排列”数据。它通过条件s.pid = s2.pid AND s.id >= s2.id连接到它自己,在单词中 - 在我之前发生的相同PID包括我,所以第一个将加入到1个记录,第二个加到两个,依此类推。然后您只需将value列更新为pid*1000,再加上排名。