2014-10-24 1 views
0

하나의 MySQL 테이블 엔트리를 다른 것으로 동적으로 참조하는 것에 관해서는 아무것도 찾을 수 없습니다. 가능하지 않을 수도 있습니다.두 번째 테이블 항목에서 mysql 테이블 항목 값을 동적으로 참조 할 수 있습니까?

기본적으로 MySQL에서 특정 Excel 셀의 값을 다른 것으로 참조하는 것과 동일한 작업을 수행 할 수 있는지 알고 싶습니다. 예를 들어, Excel에서 시트 1 셀 A1을 "MyVal"과 같은 값으로 설정합니다. 그런 다음 시트 2 셀 A1 "= Sheet1! A1"및 시트 3 셀 A1 "= Sheet2! A1"설정하면 시트 3 셀 A1의 값을 "MyVal"입니다. 시트 1 셀 A1로 이동하여 값을 "MyNewVal"로 변경하면 시트 2 셀 A1과 시트 3 셀 A1의 값이 자동으로 "MyNewVal"로 업데이트됩니다.

내 질문은 ... MySQL에서 내가 첫 번째 테이블에 다른 항목의 값과 동적으로 연결되는 첫 번째 테이블의 특정 항목의 값을 설정할 수 있습니다. 기존 PHP 코드 사용) 두 번째 테이블에 값이 있습니까? 아마도 가능한 경우 첫 번째 테이블의 항목 값은 두 번째 테이블에서 올바른 값을 쿼리하는 쿼리처럼 보일 것이라고 생각합니다.

필자는 명시 적으로 값을 동일하게 만들기 위해 PHP에 UPDATE 쿼리를 작성하는 방법을 알고 있지만 기존 PHP 코드를 변경하고 싶지 않습니다. 나는 그들을 상대적인/동적 인 방법으로 연결하고 싶다. 간단한 이유는 입니다. PHP 코드을 변경하고 싶지 않습니다. 동일한 코드가 내가 유지 관리하는 사이트 중 일부에서 사용되고 있으며, 기존 PHP 코드를 유지 보수/업그레이드를 위해 동일하게 유지하기를 원하기 때문입니다.

그러나 여러 사이트의 데이터베이스가 이미 다르므로 어떻게 든 데이터베이스 자체의 다른 테이블에있는 적절한 항목을 동적으로 연결하면됩니다.

도움이 될 것입니다. 이것이 가능하다면, 올바른 방향으로 나를 가리킬 수만 있다면 연구를 해줘서 기쁩니다.

답변

4

이 할 수있는 250 가지 방법이 있습니다 (기본적으로 두 가지를하지만 세 거기 같은 느낌) :

쉬운에서

... 어려운에 옵션 1 :

당신이 TABLEA가 필요한 경우 tableB의 값을 반영하고, tableA에 값을 저장하지 말고, tableB의 값을 사용하십시오.사용 중 하나에 가입 :

select a.*, b.col1 
from tableA a 
join tableB b on <some join condition> 

또는 부속을

select *, (select col1 from tableB where <some condition>) col1 
from tableA 

옵션 2 : 옵션 1에 만족하는 경우

이 테이블처럼 동작 뷰,로 변환 (

: 3

create view myview as 
select ... (one of the above selects) 

옵션 : 있습니다 조인 뷰) 업데이트에 대한 제한은 제외됩니다

는 TableB의 값이 TABLEA의 해당 행/열을 통해 값을 변경하고 복사 할 때 발생시키는 데이터베이스 트리거를 작성

newold 그래서 새로운 오래된 행에 주어진 특별한 이름입니다
create trigger tableB_update 
after update on tableB 
for each row 
update tableA set 
tablea_col = new.col1 
where id = new.tableA_id; 

하는 것으로 갱신중인 테이블의 값을 참조 할 수 있습니다.

귀하의 필요에 가장 적합한 옵션을 선택하십시오.

+0

대단히 감사합니다! 옵션 3은 내가 원하는 것을 할 수있는 것처럼 들립니다! 생각보다 다른 방식으로 작동하는 것처럼 들리지만 작동하는 한 그게 중요합니다 :-) 나는 트리거를 살펴볼 것입니다! 고맙습니다! –

+0

@ndiggity no prob. 나는 당신을 시작하게하는 exampke 방아쇠를 추가했다. – Bohemian

+0

예를 들어 주셔서 감사합니다. 나는 트리거를 연구 해왔고 당신이 자리하고 있습니다 ... 트리거는 정확히 내가 필요로하는 것입니다 :-) 유일한 문제는 DB에 그것을 추가하기 위해 SUPER 권한이 필요하다는 것입니다. 우리가 사용하는 호스트는 SUPER를 허용하지 않습니다. 접속하다. 그들은 CRON 작업을 사용하는 대체 방법을 제공합니다 ... 그래서 PHP를 수정하는 것뿐입니다. 그냥이 책을 읽는 사람에게 유용 할 경우에 대비하여 여기에 언급 할 것이라고 생각했습니다. –

1

데이터베이스는 실제로 이러한 유형의 기능을 제공하지 않으며 완전히 다른 패러다임입니다.

조인, 그룹 또는 기능을 사용하여 동일한 결과를 얻을 수 있습니다.

대칭 표현을 저장하려면 다양한 인터페이스에서 더 재사용 할 수 있도록보기에 쿼리를 저장하십시오. 보기에 대한 자세한 내용은 여기를 참조하십시오. http://www.mysqltutorial.org/mysql-views-tutorial.aspx

더 복잡한 것은 무엇이든간에 일부 비즈니스 분석 도구를 살펴 봐야합니다.

+0

하비와 @Michael Rotakhin는 귀하의 답변 주셔서 감사합니다. 나는 나중에 들었다 ... 데이터베이스는 데이터를 저장하기위한 것이다. 그러나 그들이이 기능을 가지고 있다면 그것은 내 인생을 더 편하게하고 더 깨끗하게 만들 것입니다. 방금이 기능을 알지 못했을 때를 대비하여 요청할 것이라고 생각했습니다. 내가 제안한 뷰 튜토리얼을 살펴볼 것이다. 고맙습니다. –

0

아마도 당신은 질문을 단순화 시켰지만 트리거를 사용할 필요는 없습니다. 테이블을 조인하면 'MyVal'이 변경되어 쿼리를 통해 자동으로 사용할 수 있습니다.

CREATE TABLE Sheet1 
    (
     `ID` int auto_increment primary key 
    , `A` varchar(5) 
    ) 
; 

INSERT INTO Sheet1 
    (`A`) 
VALUES 
    ('MyVal') 
; 

CREATE TABLE Sheet2 
    (
     `ID` int auto_increment primary key 
    , `Sheet1FK` int) 
; 

INSERT INTO Sheet2 
    (`Sheet1FK`) 
VALUES 
    (1) 
; 

CREATE TABLE Sheet3 
    (
     `ID` int auto_increment primary key 
    , `Sheet2FK` int) 
; 

INSERT INTO Sheet3 
    (`Sheet2FK`) 
VALUES 
    (1) 
; 

검색어 1 :

select 
     sheet3.id id3 
     , sheet2.id id2 
     , sheet1.id id1 
     , sheet1.a 
from sheet1 
inner join sheet2 on sheet1.id = sheet2.sheet1fk 
inner join sheet3 on sheet2.id = sheet3.sheet2fk 

Results :

| ID3 | ID2 | ID1 |  A | 
|-----|-----|-----|-------| 
| 1 | 1 | 1 | MyVal |