2016-09-26 59 views
0

我遇到了一个复杂的问题,一个数据库中的数据有三个表。

First_DB插入一个数据库的不同表数据到其他数据库的单表

-- default_users 
id username email  password 
1 Timbog [email protected] vads7y3kkjdfa 
2 Marta [email protected] vads7y3kkjdfa 

-- default_album 
album_id album_name default_user_id 
    1  Name_Tim  1 
    3  Katarina  2 
-- default_album_img 
img_id  image_file album_id 
    3  1320229733.jpg  1 
    4  3320229733.jpg  3 

Second_DB

--users 
user_id user_name  user_email  user_pass  user_image 
    1  Timbog [email protected] vads7y3kkjdfa 1320229733.jpg 
    2  Marta  [email protected] vads7y3kkjdfa 3320229733.jpg 

我用来解决这个问题是,首先获取所有的数据通过内连接的方法中,应该使用完全外部连接,并插入必填字段我的表,下面的查询是我试图让它wor:

INSERT INTO bbpin.users (user_name, user_pin, user_email, user_password, user_img) 
SELECT default_users.username, default_users.bb_pin, default_users.email, default_users.password 
FROM bbmpins_pins.default_users 
INNER JOIN bbmpins_pins.default_album_images 
ON default_album_images.album_id = default_users.id; 

我想念的事情我该如何比较两个表的ID在这个加入也许?或者这个查询全是错误的方法? 由First_DB中的seeparte中的两个表可能有多个记录我们如何将它们设置为最后一个条目? 感谢

回答

1

它看起来像您正试图从default_users表中检索所有行。并且每行还会从default_album表中返回相应的行。与此同时,表中的相应行(default_album_img)。

给出的示例数据,使用内部连接的查询将返回指定的结果:

SELECT u.id    AS user_id 
     , u.username  AS user_name 
     , u.email   AS user_email 
     , u.password  AS user_pass 
     , i.image_file  AS user_image 
    FROM default_users u 
    JOIN default_album a 
    ON a.default_user_id = u.id 
    JOIN default_album_img i 
    ON i.album_id = a.album_id 

该查询将为示例数据工作。

但是,如果在default_user行不具有匹配的行default_album,然后内部联接将不会返回该行:

-- default_users 
id username email   password 
3 branstark [email protected] warg2 

或者,如果有两个或两个以上在default_album行给定用户匹配,那么查询将返回从default_user行的两个副本...

-- default_album 
album_id album_name default_user_id 
    1  Tim2   1 

没有什么是在这些情况下要返回一个规范,我们不能推荐查询。

+0

或者我们可以一个接一个地做,patty方法将所有数据从一张表插入到另一张表,而没有冲突表,并且当它完成匹配fk和相册键并插入它时,仍然需要处理那些多个值 –

+0

如果我删除用户表的主键作为唯一键,会有什么帮助?我们可以这样做吗? –

+0

查询确实取决于您试图实现的内容。如果内部连接查询产生一个“缺少”行或具有“重复”行的集合,那么可以解决这个问题。我们可以使用OUTER连接来避免“丢失”行,或者我们可以通过在SELECT列表中使用相关子查询来避免连接。为了避免“重复”行,我们可以在SELECT列表中使用GROUP BY和聚合表达式,或者(再次)使用相关子查询。这真的取决于你想要返回的结果。 – spencer7593

1

我使用JOIN看不出什么毛病你目前的做法,但可以修改它有点更具可读性,你也必须将关系表

INSERT INTO bbpin.users (user_id, user_name, user_pin, user_email, user_password, user_img) 
SELECT du.id, 
du.username, 
du.bb_pin, 
du.email, 
du.password, 
dai.image_file 
FROM bbmpins_pins.default_users du 
JOIN bbmpins_pins.default_album da ON du.id = da.default_user_id 
INNER JOIN bbmpins_pins.default_album_images dai 
ON dai.album_id = da.album_id; 
+0

因为我们必须从第三个表中获取图像值,所以它会给出直接计数错误 –

+0

@HabibRehman,如果有帮助,请参阅编辑答案。 – Rahul

+0

同样的错误,列计数与值计数不匹配。我猜可能会有多个用户插入相册,这可能是问题所在? –

相关问题