2011-09-24 2 views
1

내가 3 개 테이블mySQL의 데이터를 3 차원에서 2로 "병합"하는 올바른 방법은 무엇입니까?

레이블

UserValues ​​

사용자가

레이블은 다음과 같습니다

1|First Name 
2|Last Name 
3|Favorite Book 
etc... 

사용자를 다음과 같습니다

1|[phone_number] 
2|[phone_number] 
etc.... 

UserValues은 다음과 같습니다

1| [label_id_for_First_Name] |John  | [user_id] 
2| [label_id_for_Last_Name] |Smith  | [user_id] 
3| [label_id_for_Fav_Book] |Moby Dick | [user_id] 
etc... 

일부 사용자는 일부 필드 (모든 기본 키로 사용되는 전화 번호를 제외하고 선택 사항)에서 작성되지 수 있습니다. 내가 같이이 데이터를 평평하게하는 하나의 질의 쓸 수있는 방법으로 난처한 상황에 빠진거야

:

uid  |First_Name|Last_Name | Favorite_Book 
[user_id]|John  |Smith  | Moby Dick //user has all fields filled in 
[user_id]|Mary  | [null] | Kite Runner //user didn't have a last name 

아이디어는 라벨이 있었다으로는 많은 열에 대한 열 너비 성장 것입니다 이러한 특정 사용자와 관련되어 있습니다.

저는 사용자를 선택하고 모든 값이 오른쪽으로 나가는 사용자 당 1 행을 갖고 싶습니다.

몇 가지 쿼리에서이 작업을 수행하는 방법을 알 수 있지만이 작업을 수행하는 올바른 방법이 무엇인지 궁금해하고 있습니다. (어쩌면 여러 쿼리에서 수행하는 것이지만 그렇지 않을 수도 있습니다.)

TIA. 현재 데이터를 사용하고 예에서 결과를 제공하는 쿼리를 작성하려면

+2

체크 아웃 EAV 패턴 (그것을 구글) . – Dani

+2

열이 _ 알 수없는 일반 열인 경우 별도의 값 표 대신 표에 포함 시키십시오. 열이 _unknown_ 인 경우 원하는 열을 선택하지 않고도 합리적인 표보기를 동적으로 얻으려면 어떻게해야합니까? 수천 개의 열을 사용할 수 없습니까? –

+0

@ Dr.Dredel : [데이터베이스 정규화 규칙] (http://en.wikipedia.org/wiki/Database_normalization)을 직접 배우십시오. 테이블 스키마는 1NF에도 없습니다. 단일 셀은 도메인/열에 속한 단일 고유 값을 가져야합니다. 다른 도메인에 속한 열 값은 같은 열에 섞어서는 안됩니다. – Shef

답변

1

이 그것을 것 :

SQL 코딩 공포

SELECT 
    u.id as user_id 
    , uvfirstname.value as firstname 
    , uvlast_name.value as lastname 
    , uvbook.value as book 
FROM users u 
LEFT JOIN uservalues uvfirstname 
     ON (uvfirstname.label_id = 
      (SELECT l1.id FROM label l1 WHERE l1.name = 'First name') 
      AND uvfirstname.user_id = u.id) 
LEFT JOIN uservalues uvlastname 
     ON (uvlastname.label_id = 
      (SELECT l2.id FROM label l2 WHERE l2.name = 'Last name') 
      AND uvlastname.user_id = u.id) 
LEFT JOIN uservalues uvbook 
     ON (uvbook.label_id = 
      (SELECT l3.id FROM label l3 WHERE l3.name = 'Fav book') 
      AND uvbook.user_id = u.id) 
관련 문제