2013-04-08 3 views
0

이 작업을 수행하는 방법이 있습니까? 다른 테이블의 필드에서 테이블 이름을 가져 와서 해당 테이블의 모든 열을 key : val의 한 줄로 압축 할 수있는 쿼리. 쌍. http://sqlfiddle.com/#!2/b0c27테이블을 쿼리하여 필드에서 다른 테이블의 이름을 가져 와서 최종 쿼리 수행

ID FT_ID FT_DATA_ID NAME  TABLE     DATA 
1 1  1   one   features_data_one  ro_one: A; ro_two: B 
2 2  1   two   features_data_two  rt_two: C; rt_two: D 



/****** list of features with the name and the table the data lies in */ 
CREATE TABLE features (
     id INT AUTO_INCREMENT PRIMARY KEY, 
     name VARCHAR(20) NOT NULL, 
     `table` VARCHAR(255) NOT NULL 
); 
INSERT INTO features(name, `table`) VALUES ('one', 'features_data_one'); 
INSERT INTO features(name, `table`) VALUES ('two', 'features_data_two'); 


/****** feature one */ 
CREATE TABLE features_data_one (
     id INT AUTO_INCREMENT PRIMARY KEY, 
     ro_one VARCHAR(20) NOT NULL, 
     ro_two VARCHAR(20) NOT NULL 
); 
INSERT INTO features_data_one (ro_one, ro_two) VALUES ('A', 'B'); 



/****** feature two */ 
CREATE TABLE features_data_two (
     id INT AUTO_INCREMENT PRIMARY KEY, 
     rt_one VARCHAR(20) NOT NULL, 
     rt_two VARCHAR(20) NOT NULL 
); 
INSERT INTO features_data_two (rt_one, rt_two) VALUES ('C', 'D'); 

/****** association table which links a feature with a feature_id. The feature_id is the id in a specific table. This table is specificed in the feature table. */ 
CREATE TABLE assoc (
     id INT AUTO_INCREMENT PRIMARY KEY, 
     ft_id INT NOT NULL, 
     ft_data_id INT NOT NULL 
); 
INSERT INTO assoc (ft_id, ft_data_id) VALUES (1, 1); 
INSERT INTO assoc (ft_id, ft_data_id) VALUES (2, 1); 


SELECT * 
FROM assoc a 
INNER JOIN features as ft ON a.ft_id = ft.id; 

답변

0

이럴, 당신은 이상하고 SQL과 매우 부 자연스러운 무언가를 만들려고 :

바이올린 (단지 ASSOC 테이블 ft_data_id에서 하나가 결정됩니다).

왜 단 하나의 테이블을 만들지 않으시겠습니까?

CREATE TABLE features_all (
     id INT AUTO_INCREMENT PRIMARY KEY, 
     feature_name varchar(20) not null, 
     ro_one VARCHAR(20) NOT NULL, 
     ro_two VARCHAR(20) NOT NULL, 
     index(feature_name) 
); 
INSERT INTO features_all (feature_name, ro_one, ro_two) values 
('one', 'A', '1'), 
('one', 'C', '31'), 
('one', 'Z', '71'), 
('two', 'A', '1'), 
('two', 'S', '12'), 
('two', 'D', '14'); 

이 스타일은 기능을 추가하는 데 도움이됩니다 (세 번째 추가 등). 그냥 새 행을 삽입하십시오! 표를 만들 필요가 없습니다!

나는 당신의 사건을 모르는, 그러나 때때로 당신이 선택한 기능에있는 키의 하나 개의 값을 얻을 것이다 보장하기 위해

 unique(feature_name, ro_one) 

 index(feature_name) 

를 대체하는 유용

+0

hi v.sheldeshov, 이것은 각기 다른 열이있는 100 개의 테이블이있을 수있는 이유 중 하나입니다. – user391986

+0

좋습니다.하지만이 100 개의 테이블을 모두 하나로 병합하는 것이 좋습니다. –

+0

잘 모르겠지만 속성의 값에 따라 조인 할 올바른 tablename을 선택하는 것은 쉽지 않습니다. 5NF http://en.wikipedia.org/wiki/Fifth_normal_form –

관련 문제