2014-01-11 3 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

У вас нет выбора, поэтому производительность не вызывает беспокойства; вы должны делать то, что вы должны делать. Пока он выполняет «ОК», не беспокойтесь об этом. – Bohemian

Смежные вопросы