【问题标题】:Update table with same value based on given ID根据给定 ID 更新具有相同值的表
【发布时间】:2014-03-17 14:36:39
【问题描述】:

我想用 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 设置为最大。

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

提前致谢。

【问题讨论】:

  • 这是旧版应用程序吗?否则没有理由你应该使用非常过时的mysql_query 接口。
  • 您为什么不在另一个表中将file_version 设置为MAX(file_version),以获取具有相同name 的所有条目?您在这里的要求很难满足。为什么ID - 1
  • 尽管您没有使用PDO(因为您确实应该使用),但您应该尝试使用SET field = field - 1 增加计数。
  • +1 用于正确评估自己迄今为止的努力。 ;-)

标签: php mysql sql


【解决方案1】:

试试这个,您将避免使用带有子查询的可怕 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*

【讨论】:

    【解决方案2】:
    $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 个值...然后您可以同时存储与 1 行相关的所有数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      相关资源
      最近更新 更多