2017-02-23 2 views
1

현재 데이터베이스를 마이그레이션하고있는 레일 응용 프로그램이 있습니다. 두 개의 개별 테이블에서 두 개의 열을 연결하고 SQL을 사용하여 db에 삽입

는 이전에 그들은 두 개의 테이블이 있었다 : 사용자 및 기업 사용자 내에서

하위 도메인 엔트리가를 기업 내에서 도메인 _의 항목이 있습니다.

사이트라는 새 테이블을 만들고 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를 사용하려고 한 것이 었습니다. 모든이

INSERT INTO user_sites (user_id) SELECT id FROM users; 

가 그럼 난으로 만들 user_site에 USER_ID를 추가하여

내가 user_sites의 행을 작성하여 시작 : 여기

내가 사용자와 회사 테이블에서 데이터를 이동하는쪽으로 갔다 접근입니다 내가 user_sites의 사이트 ID를 설정

이후
INSERT INTO sites (domain_name) SELECT id FROM users; 

사용자가 같은 사이트에 많은 행

이제
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 

,

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 

모든 마지막 도메인 부분을 제외하고 작동 CONCAT 도메인 이름과 도메인 이름을 업데이트 실패 부분. 확인하면 도메인이 모두 0입니다.

답변

2

는 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 
+0

문제는 이제 조인 테이블을 필요로 합류했다. 귀하의 논리를 사용하여 계정에 추가 내부 조인을 추가하려고했지만 실패했습니다. 나는 더 명확하게하려고 노력하는 것을 만들기 위해 질문을 업데이트했다. –

+0

"실패"란 무엇을 의미합니까? 오류가 있습니까? 잘못된? 결과? 결과가 없다 ? – scaisEdge

+0

SQL을 사용하여 질문이 끝나면 실행될 것입니다 (레일 이동 파일에서 실행 중입니다).하지만 실제로는 아무것도 표시되지 않습니다. –

관련 문제