【问题标题】:Concatenate two columns, from two separate tables and insert into db using SQL连接来自两个单独表的两列并使用 SQL 插入数据库
【发布时间】:2017-02-23 16:32:29
【问题描述】:

我有一个 Rails 应用程序,目前正在迁移数据库。

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

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

我创建了一个名为 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_id 添加到每个 user_site 来在 user_sites 中创建行

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

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

【问题讨论】:

    标签: mysql sql ruby-on-rails activerecord


    【解决方案1】:

    在 mysql 中,您可以使用更新加入一个基于表的选择加入表

        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  
    

    【讨论】:

    • 这个问题现在需要一个连接表。我试图使用您的逻辑添加一个额外的内部连接来解决它,但我没有成功。我更新了问题,使我想要做的事情更清楚。
    • 你的“不成功”是什么意思......你有错误吗?错误的?结果?没有结果?
    • 使用我结束问题的 SQL,它将运行(我在 rails 迁移文件中运行它),但它返回 nil 并且实际上似乎没有做任何事情。
    • 您的查询似乎正确.. 所以请尝试检查您用于测试的数据.. 最终更新了您的问题。具有适当的数据样本和预期的结果..
    • 如果用户和公司表已填充,但 user_sites 和站点表是全新的。这会为站点表中的每个新站点名称创建一个新条目吗?我忙于移动数据,以至于忽略了一个表是空的这一事实。
    猜你喜欢
    • 2018-04-27
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2014-10-05
    相关资源
    最近更新 更多