2012-08-21 2 views
1

나는 3 개의 MySQL 테이블을 가지고있다 : 자동차, 사용자 및 방문자.MySQL 동적 테이블 이름 관계

테이블 카는 테이블 사용자 또는 테이블 방문자와 관련 될 수 있습니다. 테이블 사용자와 방문자는 서로 다른 테이블 구조를가집니다. 이 모든 테이블에 가입하고 개인 데이터를 검색하고 싶습니다. 현재 PHP를 사용하여 사람 데이터를 검색하고 있습니다.

이러한 종류의 관계를 생성하는 데 가장 적합한 테이블 구조입니까? 단일 MySQL 쿼리를 사용하여 사람 정보를 검색하는 방법이 있습니까? 당신은 외부를 사용할 수

 
[cars] 
id | car_name | person_type | person_id 
--------------+-------------+-------- 
1 | car 1 | user  | 1 
2 | car 2 | visitor  | 1 

[users] 
id | name 
---+---------- 
1 | person 1 

[visitors] 
id | first_name | last_name 
---+------------+---------- 
1 | person  | 2 

답변

1

은 다음과 같이 조인

select 
    a.ID, 
    a.car_name, 
    a.person_type, 
    b.name as username, 
    c.name as visotorName 
from 
    cars a 
     left outer join users b 
      on a.person_id=b.ID 
     left outer join visitors c 
      on a.person_id=c.ID 

난 당신이뿐만 아니라의 빠른 읽기를 할 수 있습니다 매우 비슷한 질문에 오히려 detailed answer을 썼다. 리턴 된 행 수와 행 당 리턴되는 수의 측면에서 원하는 방식으로 데이터를 형식화하는 데 사용할 수있는 몇 가지 다른 함수를 보여줍니다.

1

몇 가지 옵션을 사용할 수 있습니다. 하나는 게시물에 언급되어 있습니다. 셀렉트는 다음과 같이 될 것이다 :

select * from 
    cars a 
    left join users u on (a.person_type='user' and a.person_id=u.id) 
    left join visitors v on (a.person_type='visitor' and a.person_id=v.id) 

또 다른 옵션은 person_typeperson_id 단순히 user_idvisitor_id 모두를 대신합니다. 둘 다 nullable이며, 강력한 외래 키를 넣을 수도 있습니다. 선택은 매우 유사합니다

select * from 
    cars a 
    left join users u on (a.user_id=u.id) 
    left join visitors v on (a.visitor_id=v.id) 

마지막으로, 아마 당신은 하나의 테이블에 usersvisitors 테이블을 병합 할 수 있습니다?

[cars] 
    ID | car_name | person_id 
-----+----------+------------- 
    1 | car 1 | 1 
    2 | car 2 | 2 

[persons] 
    ID | type | name 
-----+---------+---------- 
    1 | user | person 1 
    2 | visitor | person 2 

은 선택은 매우 단순하게 :

select * from cars c join persons p on (c.person_id=p.id)