Php 基于给定ID使用相同值更新表

Php 基于给定ID使用相同值更新表,php,mysql,sql,Php,Mysql,Sql,我想用mySQL更新一个表,其中的行与给定ID的名称同名,并增加和减少它们的文件版本 该函数应还原文件的旧版本 我的桌子看起来像这样: ID | name | file_version 1 | book-1 | 1 2 | book-1 | 2 3 | book-1 | 3 4 | book-2 | 1 该函数提供变量$docId和$fileVersion 首先,我在表中搜索max.

我想用mySQL更新一个表,其中的行与给定ID的名称同名,并增加和减少它们的文件版本

该函数应还原文件的旧版本

我的桌子看起来像这样:

ID    |    name    |    file_version
1     |  book-1    |    1
2     |  book-1    |    2
3     |  book-1    |    3
4     |  book-2    |    1
该函数提供变量$docId和$fileVersion

首先,我在表中搜索max.file_版本并将其存储在变量中

$query = 
'SELECT max(file_version) FROM myTable where doc_name in (
    SELECT doc_name FROM myTable
WHERE id = '.$docId.');';
$result1 = mysql_query($query);
$row = mysql_fetch_row($result1);
$maxVersion = $row[0];
之后,我将所需ID的文件版本设置为max

$query2 = 'SELECT file_version FROM dscQm_docs WHERE id='.$docId.';';
$result2 = mysql_query($query2);
$row = mysql_fetch_row($result2);
$fileVersion = $row[0];
现在是棘手的部分。 如果所有文档的文件版本高于给定ID的文件版本,我想将其文件版本设置为与给定ID的名称相同的文件版本-1

以下是我的方法:

    $query4 = '
        UPDATE myTable SET file_version = file_version -1 WHERE( 
        SELECT * FROM myTable 
        WHERE name in (
           SELECT name FROM myTable
           WHERE id = '.$docId.' AND file_version > '.$fileVersion.'
        );
    ';
那不行

对不起,我的SQL不太好。我知道这是废话

你能帮我解释一下最后一条SQL语句吗

提前谢谢

$query4 = '
        UPDATE myTable SET file_version = file_version -1 WHERE name like (
           SELECT name FROM myTable
           WHERE id = '.$docId.' AND file_version > '.$fileVersion.'
        )';
试试这个

编辑:如果你知道这个名字,为什么不只比较一下名字呢

比如:

 $query4 = "UPDATE myTable SET file_version = file_version -1 WHERE name like '$name'";

编辑2:你为什么不工作?而不是使用这么多不同的查询?要始终获得1个值。。。然后,您可以同时存储与一行相关的所有数据。

尝试此操作,您将避免使用子查询的非常可怕的IN运算符(至少可以说,它们有时效率低下)


这是一个遗留应用程序吗?否则,您没有理由使用非常过时的
mysql\u查询
界面。为什么不在另一个表中将
file\u version
设置为
MAX(file\u version)
,用于所有具有相同
名称的条目?你在这里的要求很难遵守。为什么
ID-1
?尽管事实上你没有使用
PDO
(因为你真的应该这么做),但你应该尝试使用
SET field=field-1
+1来增加计数,以正确评估你迄今为止的努力
update myTable as t1
left join myTable as t2 on (t1.name = t2. name)
set t2.file_version = t2.file_version -1
where t2.file_version > t1.file_version
and t1.id = *YOUR_ID*