根据给定的ID更新具有相同值的表

时间:2014-03-17 14:36:39

标签: php mysql sql

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

该功能应该恢复文件的旧版本。

我的表格如下:

ID    |    name    |    file_version
1     |  book-1    |    1
2     |  book-1    |    2
3     |  book-1    |    3
4     |  book-2    |    1

该函数提供变量$ docId和$ fileVersion。

首先我搜索最大值。表中的file_version并将其存储在变量中。

$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的file_version设置为max。

$query2 = 'SELECT file_version FROM dscQm_docs WHERE id='.$docId.';';
$result2 = mysql_query($query2);
$row = mysql_fetch_row($result2);
$fileVersion = $row[0];

现在是棘手的部分。 我想设置所有文档的file_version,其名称与给定ID的名称相同,如果它们的file_version高于给定ID的file_version。

这是我的方法:

    $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语句吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

$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'";

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

答案 1 :(得分:0)

试试这个,你将避免使用子查询的可怕的IN运算符(至少可以说它们有时效率低下)!

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*