2014-01-11 50 views
0

我想创建一个可以稍后使用的联系人表。所以结构:查询中的多个JOIN

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

此查询是一个不好的做法? (超过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) 
    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

难道你没有三个加入,而不是十个? – BenM

+0

嗯,这是不好的做法,因为在关系数据库中最好避免使用EAV,但有时候没有其他选择,在这种情况下,传统方法是采用MAX(CASE WHEN THEN END)语法。它很简单(可能更快)。此外,正如您所拥有的,包括WHERE子句中的条件将排除可能不符合您要求的NULL结果。 – Strawberry

+0

@BenM,将会有十个 – user2577399

回答

0

查询是不是“坏习惯”,但移动额外的条件到他们所属的连接语句:

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

如果我使用它超过3个,比如10个,它的性能可以吗? – user2577399

+0

你没有选择,所以表现不是真正的关注;你必须做你必须做的事情。只要它执行“OK”,不用担心。 – Bohemian