Mysql 通过链接表将某些数据从一个表的列复制到另一个表中

Mysql 通过链接表将某些数据从一个表的列复制到另一个表中,mysql,sql,Mysql,Sql,作为继承系统非常缓慢的重构过程的一部分,我需要消除几个缓慢的连接和子查询。在我熟悉这个系统的同时,我正在慢慢清理数据库结构,摆脱被管道胶带粘在一起的感觉,进行渐进式的改进,希望在此期间不会出现任何问题。其中一部分涉及将两个由第三个表链接的表中的数据合并为一个表 表结构与此类似: CREATE TABLE groups ( group_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, -- various other fields th

作为继承系统非常缓慢的重构过程的一部分,我需要消除几个缓慢的连接和子查询。在我熟悉这个系统的同时,我正在慢慢清理数据库结构,摆脱被管道胶带粘在一起的感觉,进行渐进式的改进,希望在此期间不会出现任何问题。其中一部分涉及将两个由第三个表链接的表中的数据合并为一个表

表结构与此类似:

CREATE TABLE groups
(
    group_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -- various other fields that are appropriate to groups
    ...
    -- these fields need to be filled
    a ENUM(...) NOT NULL,
    b INTEGER NOT NULL,
    c VARCHAR(...) NOT NULL
);

CREATE TABLE items
(
    -- key is determined by an external data source
    item_id INTEGER NOT NULL PRIMARY KEY,
    -- various other fields that are appropriate to items
    ...
    -- these fields shouldn't be here, but in the groups table
    a ENUM(...) NOT NULL,
    b INTEGER NOT NULL,
    c VARCHAR(...) NOT NULL
);

CREATE TABLE group_items
(
    item_id INTEGER NOT NULL,
    group_id INTEGER NOT NULL,
    PRIMARY KEY (item_id,group_id)
);
一个项目可以在多个组中。表项中的每条记录都有a、b和c列的值,这些值实际上不是项的属性,而是项所属的组的属性。这会导致问题,因为如果项目位于另一个组中,则值可能不同

我还不能从items表中删除这些字段,因为它们是由一个近乎疯狂的数据源中的疯狂导入过程填充的。在我着手修复导入过程之前,我一直坚持让字段存在于items表中,但在短期内,至少我可以消除获取字段的缓慢查找


现在我在PHP中有一个循环,它在每个组上运行,从它遇到的第一个项目中获取值,这很好-一个组中的所有项目都将具有相同的a、b和c值,并将它们放入组中。这个过程相当缓慢和费力,不幸的是,在一个超载和动力不足的服务器上运行非常频繁。有没有一种聪明的方法可以将这些值以及只有这些值从items表复制到groups表中,并让MySQL完成繁重的工作,而不是依赖PHP脚本?

看起来我找到了自己的答案。由于每组中的项目数量相对较少,可能会有一些重复的工作正在进行,但这不是瓶颈,而且比PHP循环快得多:

UPDATE
    groups g
    INNER JOIN group_items USING(group_id)
    INNER JOIN items i USING(item_id)
SET
    g.a = i.a,
    g.b = i.b,
    g.c = i.c;
似乎做了我需要的