MySQL:对于表中的每一行,更改另一表中的一行

路加

我有两个表:

SELECT * FROM data;
+----+---+---+
| id | c | g |
+----+---+---+
|  1 | 1 | 2 |
|  2 | 1 | 2 |
|  3 | 1 | 2 |
|  4 | 1 | 3 |
|  5 | 2 | 2 |
|  6 | 2 | 3 |
|  7 | 2 | 3 |
+----+---+---+

SELECT * FROM changes;
+----+-------+-------+---+
| id | c_old | c_new | g |
+----+-------+-------+---+
|  1 |     1 |     2 | 2 |
|  2 |     2 |     1 | 3 |
|  3 |     1 |     2 | 2 |
+----+-------+-------+---+

对于其中的每一行,changes我都需要在datawhere中精确地更改一行data.g=changes.g and data.c=changes.c_old(假设总会有足够的匹配项)

我正在尝试通过以下查询执行此操作:

UPDATE 
data INNER JOIN changes ON 
  data.c=changes.c_old AND p.g=changes.g 
SET data.c_id=changes.c_new 
WHERE data.id IN( 
  SELECT id FROM (
    SELECT data.id from 
    data INNER JOIN changes ON
      data.c=changes.c_old AND data.g=changes.g 
    GROUP BY changes.id
  ) AS another_table
)

现在,令我感到惊讶的是,一团糟的查询运行了。但是,它不能满足我的需求。最里面的选择返回此表:

+----+
| id |
+----+
|  1 |
|  6 |
|  1 |
+----+

注意1出现两次。这意味着当我需要更改三行时,只有两行被更改(或行1被更改了两次)。有没有办法确保该子查询中的每个ID都是唯一的?有没有更好的办法来解决这个问题?

提前致谢!

莫格兰

您选择的字段不属于该组,也不属于该组。

SELECT data.id from 
data INNER JOIN changes ON
    data.c=changes.c_old AND data.g=changes.g 
GROUP BY changes.id

您应该在select的data.id上使用聚合函数,或将data.id添加到groupby(尽管我怀疑那也不是您想要的结果)

INNER JOIN是此数据集中的结果

+---------+--------+--------+------------+---------------+---------------+-----------+
| data.id | data.c | data.g | changes.id | changes.c_old | changes.c_new | changes.g |
+---------+--------+--------+------------+---------------+---------------+-----------+
|       1 |      1 |      2 |          1 |             1 |             2 |         2 |
|       1 |      1 |      2 |          3 |             1 |             2 |         2 |
|       2 |      1 |      2 |          1 |             1 |             2 |         2 |
|       2 |      1 |      2 |          3 |             1 |             2 |         2 |
|       3 |      1 |      2 |          1 |             1 |             2 |         2 |
|       3 |      1 |      2 |          3 |             1 |             2 |         2 |
|       6 |      2 |      3 |          2 |             2 |             1 |         3 |
|       7 |      2 |      3 |          2 |             2 |             1 |         3 |
+---------+--------+--------+------------+---------------+---------------+-----------+

由于连接中有多个匹配项,因此将1,2,3展开,而由于没有匹配项而将4,5删除了

然后,您将按changes.id分组,这将导致(分组后在CSV列表中显示值)

+---------+--------+--------+------------+---------------+---------------+-----------+
| data.id | data.c | data.g | changes.id | changes.c_old | changes.c_new | changes.g |
+---------+--------+--------+------------+---------------+---------------+-----------+
|   1,2,3 |  1,1,1 |  2,2,2 |          1 |         1,1,1 |         2,2,2 |     2,2,2 |
|   1,2,3 |  1,1,1 |  2,2,2 |          3 |         1,1,1 |         2,2,2 |     2,2,2 |
|     6,7 |    2,2 |    3,3 |          2 |           2,2 |           1,1 |       3,3 |
+---------+--------+--------+------------+---------------+---------------+-----------+

由于没有从可用选项中选择值的合计或确定性方式,因此将从为changes.id 1和3选择的data.id中获取1。

根据您想要的内容,您是否需要3行?所有不同的价值?您应该将确定性行为添加到选择中。

顺便说一句,我很确定其他SQL引擎将不允许该选择(例如MSSQL),因为它含糊不清。至于在这种情况下的MySQL行为,我相信它会从存储的第一行中选择第一个值,因此为什么在两种情况下都可能获得1,但可以自由选择所需的任何值。

http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html

MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。但是,这主要在每个组的每个未聚合列中未在GROUP BY中命名的所有值都相同时才有用。服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。此外,通过添加ORDER BY子句不能影响从每个组中选择值。选择值之后,将对结果集进行排序,并且ORDER BY不会影响服务器在每个组中选择哪个值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在MS SQL表中为另一表中的每一行创建多行

来自分类Dev

将表的每一行与SQL Server 2008中的另一表进行比较

来自分类Dev

PostgreSQL对一个表中的每一行联接另一表中的所有行

来自分类Dev

将表的一行链接到MySQL中另一表的多行

来自分类Dev

如何针对另一表中的另一列为每一行搜索表列

来自分类Dev

将表中的许多行插入另一表中的唯一行

来自分类Dev

使用 Laravel 中同一表中另一行的数据更新行

来自分类Dev

从一个表中的一列中为每一行打印出值列表,在另一表中具有重叠的间隔

来自分类Dev

SQL QUERY在一行中多次搜索以从同一表的另一行中查找数据

来自分类Dev

SQL QUERY在一行中进行多次搜索以从同一表的另一行中查找数据

来自分类Dev

将每一行分配给另一个表中的每一行

来自分类Dev

将鼠标悬停在一个表中的行上可更改另一表的另一行的样式

来自分类Dev

SQL将属性与同一表中另一行的属性进行比较

来自分类Dev

SQL-根据同一表中的另一行获取对应的列

来自分类Dev

SQL将属性与同一表中另一行的属性进行比较

来自分类Dev

如何仅更新与另一表中一行中的值对应的值?

来自分类Dev

在MySQL中,如何从一个表中获取2列,并在一行中从另一表中获取2行,作为另一表中的列?

来自分类Dev

将一个表中的动态条目数存储到另一表中的一行

来自分类Dev

从继承的表中获取每一行的表名

来自分类Dev

表联接返回整个表中的每一行

来自分类Dev

从继承的表中获取每一行的表名

来自分类Dev

如何在一个表中选择多行,而在另一表中只选择一行?

来自分类Dev

插入到 sqlite 表中的记录对于每一行都是相同的

来自分类Dev

MySQL:对于每个用户,在具有该用户ID的另一个表中添加一行

来自分类Dev

将主表中的主键列设置为等于同一表中另一行的行

来自分类Dev

为mysql中第一个表中的每一行从另一个表中选择相应的行

来自分类Dev

数据表中每一行的工具提示

来自分类Dev

遍历表值参数中的每一行

来自分类Dev

在React的每一行中渲染表数据

Related 相关文章

  1. 1

    在MS SQL表中为另一表中的每一行创建多行

  2. 2

    将表的每一行与SQL Server 2008中的另一表进行比较

  3. 3

    PostgreSQL对一个表中的每一行联接另一表中的所有行

  4. 4

    将表的一行链接到MySQL中另一表的多行

  5. 5

    如何针对另一表中的另一列为每一行搜索表列

  6. 6

    将表中的许多行插入另一表中的唯一行

  7. 7

    使用 Laravel 中同一表中另一行的数据更新行

  8. 8

    从一个表中的一列中为每一行打印出值列表,在另一表中具有重叠的间隔

  9. 9

    SQL QUERY在一行中多次搜索以从同一表的另一行中查找数据

  10. 10

    SQL QUERY在一行中进行多次搜索以从同一表的另一行中查找数据

  11. 11

    将每一行分配给另一个表中的每一行

  12. 12

    将鼠标悬停在一个表中的行上可更改另一表的另一行的样式

  13. 13

    SQL将属性与同一表中另一行的属性进行比较

  14. 14

    SQL-根据同一表中的另一行获取对应的列

  15. 15

    SQL将属性与同一表中另一行的属性进行比较

  16. 16

    如何仅更新与另一表中一行中的值对应的值?

  17. 17

    在MySQL中,如何从一个表中获取2列,并在一行中从另一表中获取2行,作为另一表中的列?

  18. 18

    将一个表中的动态条目数存储到另一表中的一行

  19. 19

    从继承的表中获取每一行的表名

  20. 20

    表联接返回整个表中的每一行

  21. 21

    从继承的表中获取每一行的表名

  22. 22

    如何在一个表中选择多行,而在另一表中只选择一行?

  23. 23

    插入到 sqlite 表中的记录对于每一行都是相同的

  24. 24

    MySQL:对于每个用户,在具有该用户ID的另一个表中添加一行

  25. 25

    将主表中的主键列设置为等于同一表中另一行的行

  26. 26

    为mysql中第一个表中的每一行从另一个表中选择相应的行

  27. 27

    数据表中每一行的工具提示

  28. 28

    遍历表值参数中的每一行

  29. 29

    在React的每一行中渲染表数据

热门标签

归档