根据计数条件指定的 MySQL 更新

标签 mysql sql-update

我有以下问题: 我想更新 COUNT 条件大于 1 的所有行,否则我想更新除 1 之外的所有行。它还应该根据 other_ID 进行更新。

虚拟表:

+----+----------+----------+-------------+
| id | other_ID | cirteria | updatefield |
+----+----------+----------+-------------+
|  1 |        1 |        1 |           0 |
|  2 |        1 |        1 |           0 |
|  3 |        1 |     1234 |           0 |
|  4 |        2 |        2 |           0 |
|  5 |        2 |        1 |           0 |
|  6 |        2 |        1 |           0 |
|  7 |        4 |       20 |           0 |
|  8 |        4 |        1 |           0 |
|  9 |        4 |       60 |           0 |
| 10 |        5 |        1 |           0 |
| 11 |        5 |        1 |           0 |
| 12 |        6 |        5 |           0 |
+----+----------+----------+-------------+

预期结果:

+----+----------+----------+-------------+
| id | other_ID | cirteria | updatefield |
+----+----------+----------+-------------+
|  1 |        1 |        1 |           1 |
|  2 |        1 |        1 |           1 |
|  3 |        1 |     1234 |           0 |
|  4 |        2 |        2 |           0 |
|  5 |        2 |        1 |           1 |
|  6 |        2 |        1 |           1 |
|  7 |        4 |       20 |           0 |
|  8 |        4 |        1 |           1 |
|  9 |        4 |       60 |           0 |
| 10 |        5 |        1 |           0 |
| 11 |        5 |        1 |           1 |
| 12 |        6 |        5 |           0 |
+----+----------+----------+-------------+

我的想法:

UPDATE pics AS tu SET updatefield=1 WHERE criteria=1 AND (select count(*) as cnt2 from pics where criteria>1 group by other_id)>1;

错误:表“tu”被指定两次,既作为“UPDATE”的目标又作为单独的数据源

此外,我在获得正确的计数方面也遇到了问题: SELECT other_id, count() as cnt FROM pics AS ts WHERE criteria=1 and (select count() as cnt2 from pics where criteria>1)>0 GROUP BY other_id;

我想为 other_id=5 获取 cnt = 1,但我得到 cnt=2

与 选择 other_id, COUNT(*) AS cnt2 来自图片 其中条件>1 按 other_id 分组;

我得到了我想要更新更新字段的所有 other_ids 。但如何将其与更新连接起来呢?以及如何获取 other_id=5 之外的所有内容

最佳答案

您可以将子查询别名为另一个查询,例如:

UPDATE test
SET updatefield = 1
WHERE updatefield = 0 AND criteria = 1
AND other_id IN (
    SELECT a.id FROM (
        SELECT other_id AS id
        FROM test
        WHERE criteria > 1
        GROUP BY other_id
        HAVING COUNT(*) > 1
     ) a
  );

这是SQL Fiddle

更新

这将更新符合条件 0>1 的记录的 ID。现在,要更新具有 1 条件的多个记录的记录,您需要执行如下操作:

UPDATE test
SET updatefield = 1
WHERE updatefield = 0 AND criteria = 1
AND id IN (
    SELECT a.id FROM (
        SELECT MIN(id) AS id
        FROM test
        WHERE criteria = 1
        GROUP BY other_id
        HAVING COUNT(*) > 1
     ) a
  );

关于根据计数条件指定的 MySQL 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46096560/

相关文章:

sql - 如何更新表中的所有行并增加一列?

PostgreSQL:更新大表

mysql - 为 wiki 添加安全性

php - 使用 Codeigniter 事件记录的多个表查询未给出预期结果

mysql - 如何将 1 到 1000 之间的数字插入到我在过程中创建的表中?

sql - 如何只更新 PostgreSQL 9.4 中另一个表的更改值?

C# Access Db 更新查询不起作用

javascript - 显示和隐藏 div onclick

mysql - 如何在Access表单中以多对多关系填充第三个表? (MySQL后端)

php - 使用单个查询更新多行