2012-01-13 6 views
5

테이블이 5 개 있습니다. 하나의 기본 및 4 개의 추가 (서로 다른 열을 가짐).테이블 이름이 다른 테이블의 필드 인 MySQL 조인 테이블

  1. obj_mobiles
  2. obj_tablets
  3. obj_computers
여기

내 메인 테이블 (오브젝트)의 구조는 개체.

ID | 유형 | 이름 | 등등 ...

그래서 내가하고 싶은 것은 형식 필드에 따라 다른 (obj_mobiles, obj_tablets, ...) 테이블과 개체를 조인하는 것입니다. 동적 SQL을 사용해야한다는 것을 알고 있습니다. 그러나 나는 수술을 할 수 없다. 나는 그것이 이런 모습이어야한다고 생각한다.

SELECT objects.type into @tbl FROM objects; 
PREPARE stmnt FROM "SELECT * FROM objects AS object LEFT JOIN @tbl AS info ON object.id = info.obj_id"; 
EXECUTE stmnt; 
DEALLOCATE PREPARE stmnt; 

끄트머리의 의사 코드

SELECT * FROM objects LEFT JOIN [objects.type] ON ... 

사람 포스트 절차는 할 수 있습니까? 또한 나는 모든 행을 단지 1 행이 아니라 갖고 싶어. 감사합니다. .

답변

7

한 번에 한 행을 제외한 모든 행 (대량 출력)을 원하면 아래의 내용이 빠르며 모든 행의 출력에는 모든 열이 포함되어야합니다.

다음은 테이블의 필드로 간주됩니다. obj_mobiles - ID | M1 | M2 obj_tablets - ID | T1 | T2 obj_computers - ID | C1 | C2 개체 - ID | 유형 | 이름 |

Select objects.*, typestable.* 
from (
    select ID as oID, "mobile" as otype, M1, M2, NULL T1, NULL T2, NULL C1, NULL C2 from obj_mobiles 
    union all 
    select ID as oID, "tablet" as otype, NULL, NULL, T1, T2, NULL, NULL from obj_tablets 
    union all 
    select ID as oID, "computer" as otype, NULL, NULL, NULL, NULL, C1, C2 from obj_computers) as typestable 
     left join objects on typestable.oID = objects.ID and typestable.otype = objects.type; 

+------+--------------------+----------+------+----------+------+------+------+------+------+------+ 
| ID | name    | type  | ID | type  | M1 | M2 | T1 | T2 | C1 | C2 | 
+------+--------------------+----------+------+----------+------+------+------+------+------+------+ 
| 1 | Samsung Galaxy s2 | mobile | 1 | mobile | 1 | Thin | NULL | NULL | NULL | NULL | 
| 2 | Samsung Galaxy Tab | tablet | 2 | tablet | NULL | NULL | 0.98 | 10 | NULL | NULL | 
| 3 | Dell Inspiron  | computer | 3 | computer | NULL | NULL | NULL | NULL | 4.98 | 1000 | 
+------+--------------------+----------+------+----------+------+------+------+------+------+------+ 

표는 다음과 같이 작성됩니다. 또한

mysql> create table objects (ID int, name varchar(50), type varchar (15)); 
Query OK, 0 rows affected (0.05 sec) 
mysql> insert into objects values (1, "Samsung Galaxy s2", "mobile"), (2, "Samsung Galaxy Tab", "tablet"), (3, "Dell Inspiron", "computer"); 
Query OK, 3 rows affected (0.00 sec) 
Records: 3 Duplicates: 0 Warnings: 0 


mysql> create table obj_mobiles (ID int, M1 int, M2 varchar(10)); 
Query OK, 0 rows affected (0.03 sec) 
mysql> insert into obj_mobiles values (1, 0.98, "Thin"); 
Query OK, 1 row affected (0.00 sec) 


mysql> create table obj_tablets (ID int, T1 float, T2 int(10)); 
Query OK, 0 rows affected (0.03 sec) 
mysql> insert into obj_tablets values (2, 0.98, 10); 
Query OK, 1 row affected (0.00 sec) 


mysql> create table obj_computers (ID int, C1 float, C2 int(10)); 
Query OK, 0 rows affected (0.03 sec) 
insert into obj_computers values (3, 4.98, 1000); 

는 결과 테이블에 저장되며, 데이터 유형은 아래 체크, 열의 데이터 유형은 원래 열과 동일한 확인.

+0

이것은 Devart의 솔루션보다 빠릅니다. –

+0

감사합니다. 이것이 제가 찾고있는 것입니다. – Cyberon

0

USE CONCAT을 사용하여 준비 문을 만드십시오. 예. objects 경우

@sql = CONCAT('SELECT * FROM objects AS object LEFT JOIN ', @tbl, ' AS info ON object.id = info.obj_id'); 
PREPARE stmnt FROM @sql; 
... 
3

objects 것을 의미 상위 테이블이다. ID은 고유 한 개체입니다. 권리? 다른 모든 항목 (휴대 전화, 태블릿, 컴퓨터)은 객체 및 모바일 용 어린이 용이며 태블릿은 동일한 ID를 가질 수 없습니다. 절은 예컨대 : WHERE o.type = '모바일', 유형을 필터링 할 WHERE

SELECT * FROM objects o 
    LEFT JOIN obj_mobiles m 
    ON o.id = m.ID 
    LEFT JOIN obj_tablets t 
    ON o.id = t.ID 
    LEFT JOIN obj_computers c 
    ON o.id = c.ID 

추가 - 그렇다면,이 간단한 쿼리를 사용하기 충분하다.

+0

더 적은 조인으로 성능 쿼리를 개선하려면 솔루션을 확인하십시오. –

관련 문제