从两个单独的表连接两列,并使用SQL插入到db中

时间:2017-02-23 16:32:29

标签: mysql sql ruby-on-rails activerecord

我有一个我正在迁移数据库的rails应用程序。

以前他们有两个表:用户和公司

在用户中有一个子域名条目,在公司内部有一个domain_name条目。

我创建了一个名为sites的新表,现在我正在尝试使用一个名为site_name的列,即subdomain.domain_name。

我知道如何使用Ruby实现这一目标,但转换所有用户的速度确实很慢。

我能做的事情如下:

execute("UPDATE sites s SET s.site_name=(SELECT sub_domain FROM users WHERE user_id=s.user_id) + '.' + (SELECT domain_name FROM companies WHERE user_id=s.user_id)")

编辑:

以下是更新的问题。

我现在有一张额外的桌子。

users
  |_ id
  |_ email
  |_ sub_domain

companies
  |_ id
  |_ domain_name

sites
  |_ id
  |_ site_name

user_sites
  |_ id
  |_ user_id
  |_ site_id

sites是我正在创建的新表,并希望将完整域迁移到。我在创建通过user_sites表的连接时遇到问题。这大致是我提出的不成功的。

UPDATE
  sites s
INNER JOIN user_sites us ON s.id=us.site_id
INNER JOIN (
  SELECT a.id, concat(a.sub_domain, '.', b.domain_name) site_address
FROM
  users as a
INNER JOIN companies as b ON a.company_id=b.id ) t ON t.id=us.user_id
SET
  s.site_name = t.site_address

编辑2:

我的部分问题是我试图使用UPDATE创建新行。

以下是我从用户和公司表中移动数据的方法:

我首先在user_sites中创建行,方法是将user_id添加到每个user_site

INSERT INTO user_sites (user_id) SELECT id FROM users;

然后我在网站中创建与用户

一样多的行
INSERT INTO sites (domain_name) SELECT id FROM users;

之后我在user_sites中设置了site_id

UPDATE user_sites us
INNER JOIN users u ON us.user_id=u.id
INNER JOIN sites s ON s.domain_name=u.id
SET site_id=s.id WHERE us.user_id=u.id

现在,失败的部分是使用concat域名更新域名

UPDATE sites s
    INNER JOIN
    user_sites us ON s.id=us.site_id
    INNER JOIN (
    SELECT a.id, concat(a.wp_username, '.', b.domain_name) site_address
    FROM users as a
    INNER JOIN
    white_labels as b ON a.white_label_id=b.id
    ) t ON t.id = us.user_id
    SET domain_name=site_address

除最后一个域名部分外,一切正常。当我检查时,域名都是零。

1 个答案:

答案 0 :(得分:2)

在mysql中,您可以使用基于select for tables of

的表连接更新
    UPDATE sites s
    INNER JOIN ( 
    select a.user_id, concat(a.sub_domain, '.', b.domain_name) united_name
    FROM users as a
    INNER JOIN companies as b on a.user_id= b.user_id ) t on t.user_id = s.user_id 
    SET s.site_name  = t.united_name