我想用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,我希望将它们的file_version设置为与给定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语句吗?
提前谢谢。
发布于 2014-03-17 22:42:26
$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:你为什么不做面向对象的工作呢?而不是使用这么多不同的查询?要始终获得1个值...然后,您可以同时存储与一行相关的所有数据。
发布于 2014-03-17 23:06:22
尝试这样做,您将避免使用子查询使用非常可怕的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*https://stackoverflow.com/questions/22457174
复制相似问题