2014-01-11 1 views
0

나중에 사용할 수있는 연락처 테이블을 만들고 싶습니다. 그래서 구조 :쿼리에 여러 JOIN이 있습니다.

table contact: id, contact_type 
table contact_meta : id, contact_id, meta_key, meta_value 

이 쿼리는 나쁜 습관입니까? 쿼리가 아닌 "나쁜 관행"

select c.id, 
    cm1.meta_value as name, 
    cm2.meta_value as email, 
    cm3.meta_value as bussiness_phone 
    from contact as c 
    left join contact_meta as cm1 on (cm1.contact_id = c.id) 
    left join contact_meta as cm2 on (cm2.contact_id = c.id) 
    left join contact_meta as cm3 on (cm3.contact_id = c.id) 
    where c.contact_type = 'supplier' and 
    cm1.meta_key = 'name' and 
    cm2.meta_key = 'email' and 
    cm3.meta_key = 'bussiness_phone' ORDER BY c.id DESC 
+0

10 개가 아니라 3 개의 조인이 있습니까? – BenM

+0

EAV는 관계형 데이터베이스에서는 사용하지 않는 것이 좋지만 때로는 대안이 없기 때문에 기존의 방법은 MAX (CASE WHEN THEN END) 구문을 사용하는 것이므로 좋지 않습니다. 그것은 간략하고 (아마도 더 빠를 것입니다). 또한 WHERE 절의 조건을 포함하여 사용자가 원하는대로 NULL 결과를 제외합니다. – Strawberry

+0

@BenM, 열 개가있을 것입니다. – user2577399

답변

0

을 (? 10 개 이상 가입),하지만 자신이 속한 조인 절에 추가 조건을 이동 :

select c.id, 
    cm1.meta_value as name, 
    cm2.meta_value as email, 
    cm3.meta_value as bussiness_phone 
from contact as c 
left join contact_meta as cm1 on cm1.contact_id = c.id and cm1.meta_key = 'name' 
left join contact_meta as cm2 on cm2.contact_id = c.id and cm2.meta_key = 'email' 
left join contact_meta as cm3 on cm3.contact_id = c.id and cm3.meta_key = 'bussiness_phone' 
order by c.id desc 

참고 불필요한 브라켓의 제거를 .

+0

10과 같이 3을 사용하면 성능이 괜찮습니까? – user2577399

+0

옵션이 없으므로 성능이 실제로 문제가되지 않습니다. 당신은해야 할 일을해야합니다. "OK"를 수행하는 한 걱정하지 마십시오. – Bohemian

관련 문제