首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >phpmyadmin更新m到n关系表以从单独的表中删除重复项

phpmyadmin更新m到n关系表以从单独的表中删除重复项
EN

Stack Overflow用户
提问于 2014-11-22 11:55:59
回答 2查看 88关注 0票数 0

我有两张桌子。

代码语言:javascript
复制
CREATE TABLE designs
    ( game_id       INT     NOT NULL,
      des_id        INT     NOT NULL,
      PRIMARY KEY(game_id, des_id),
      FOREIGN KEY(game_id) REFERENCES Game(id),
      ON UPDATE CASCADE)

CREATE TABLE designer
    ( name      VARCHAR(30)     NOT NULL,
      id        INT             NOT NULL,
      PRIMARY KEY(id),
      FOREIGN KEY(id) REFERENCES designs(des_id),
      ON UPDATE CASCADE);    

让我说我有数据:

设计:

0--0

0--1

1-2

2-3

2-4

..

设计师:

鲍勃--0

吉尔-1

鲍勃--2

罗伯-3

吉尔-4

在更新之后,我希望“设计”表看起来像:

0--0

0--1

1--0

2-3

2-1

我需要什么更新查询来完成这个任务?

我尝试过的一些查询是:

代码语言:javascript
复制
UPDATE designs
SET des_id = (
SELECT a.id
FROM designer as a
JOIN designer as b
ON a.name=b.name AND a.id < b.id
WHERE des_id = b.id);    

..。

代码语言:javascript
复制
UPDATE `designs` as a
JOIN designer as b
ON a.des_id=b.id
SET a.des_id = b.id
WHERE b.id = (
SELECT c.id
FROM designer as c
LEFT JOIN designer as d
ON c.name=d.name
WHERE c.id<d.id)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-22 12:29:12

我有个主意。请注意,它使用了以“group/order”的形式进行的有记录的黑客攻击:

代码语言:javascript
复制
UPDATE designs d 
 JOIN 
    ( select d1.id matcher_id 
           , d2.id select_id 
        from `designer` d1  
        JOIN designer d2 
          ON d1.name = d2.name 
       group 
          by d1.id 
       Order 
          by d2.id
    ) x  
   ON x.matcher_id = d.des_id 
  SET d.des_id = select_id
票数 1
EN

Stack Overflow用户

发布于 2014-11-22 12:52:44

你的左加入想法几乎是正确的,但这里有另一个更快的想法.

代码语言:javascript
复制
 DROP TABLE IF EXISTS designs;

 CREATE TABLE designs
     ( game_id INT NOT NULL 
     , designer_id INT NOT NULL
     , PRIMARY KEY(game_id, designer_id)
     );

 DROP TABLE IF EXISTS designers;

 CREATE TABLE designers
     ( name VARCHAR(30) NOT NULL
     , designer_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
     );

 INSERT INTO designs VALUES 
 (1,1),
 (1,2),
 (2,3),
 (3,4),
 (3,5);

 INSERT INTO designers VALUES 
 ('Bob',1),
 ('Jill',2),
 ('Bob',3),
 ('Rob',4),
 ('Jill',5);

 SELECT * FROM designs;
 +---------+-------------+
 | game_id | designer_id |
 +---------+-------------+
 |       1 |           1 |
 |       1 |           2 |
 |       2 |           3 |
 |       3 |           4 |
 |       3 |           5 |
 +---------+-------------+

 SELECT * FROM designers;
 +------+-------------+
 | name | designer_id |
 +------+-------------+
 | Bob  |           1 |
 | Jill |           2 |
 | Bob  |           3 |
 | Rob  |           4 |
 | Jill |           5 |
 +------+-------------+

 UPDATE designs g
   JOIN designers d
     ON d.designer_id = g.designer_id
   JOIN designers x ON x.name = d.name
   JOIN
      ( SELECT name
             , MIN(designer_id) min_designer_id
          FROM designers
         GROUP
            BY name
      ) y
     ON y.name = x.name
    AND y.min_designer_id = x.designer_id
    SET g.designer_id = x.designer_id;

 SELECT * FROM designs;
 +---------+-------------+
 | game_id | designer_id |
 +---------+-------------+
 |       1 |           1 |
 |       1 |           2 |
 |       2 |           1 |
 |       3 |           2 |
 |       3 |           4 |
 +---------+-------------+

实际上,在更新的特殊情况下,我认为这也同样有效,我不太确定这是否会降低性能.

代码语言:javascript
复制
UPDATE designs g
  JOIN designers x
    ON x.designer_id = g.designer_id
  JOIN designers y
    ON y.name = x.name
   AND y.designer_id < x.designer_id
   SET g.designer_id = y.designer_id;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27077092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档