2015-07-10 3 views
1

настоящего времени у меня следующий EAV таблица:EAV таблица выбора без присоединяется

и стандартный стол:

id 
first_name 
last_name 

Я присоединяюсь стандартная таблица на таблицу EAV для каждого значения, которое соответствует идентификатор, поэтому мой запрос выглядит примерно так:

SELECT id, first_name, last_name, fieldname1, fieldname2 
FROM standard_table 
LEFT JOIN EAV AS fieldname1 ON 
    (fieldname1.id = standard_table.id AND fieldname1.field_name = 'fieldname1') 
LEFT JOIN EAV AS fieldname2 ON 
    (fieldname2.id = standard_table.id AND fieldname2.field_name = 'fieldname2'); 

Это работает нормально, до сегодняшнего дня, где я теперь у меня 62 пользовательских поля в моей таблице EAV, это означает, что мой запрос соединяется с 62 таблицами и таким образом удаляет ограничение на соединение с таблицей MySQL и терпит неудачу.

Весь запрос выглядит как плохой способ сделать это, как я могу его переписать, чтобы он был быстрее и не требовал 62 табличных объединений.

+0

[Как повернуть объект в MySQL значение атрибута схемы] (http://stackoverflow.com/questions/649802/how-to-pivot-a-mysql-entity-attribute-value-schema) –

+0

Если вы покажете, какой результат вам нужен, тогда получите лучшую помощь. –

ответ

1

Вы также можете использовать агрегацию для EAV. Запрос выглядит так:

SELECT st.id, st.first_name, st.last_name, 
     MAX(CASE WHEN EAV.field_name = 'fieldname1' THEN fieldname1 END), 
     MAX(CASE WHEN EAV.field_name = 'fieldname2' THEN fieldname2 END) 
FROM standard_table st JOIN 
    EAV 
    ON EAV.id = st.id 
GROUP BY st.id, st.first_name, st.last_name; 

Поскольку вы получаете все больше и больше столбцов, это может работать лучше, чем десятки объединений.

+0

Может быть, @Mike Oram нужно несколько строк для одного id, first_name, last_name, в то время как ваш запрос будет предоставлять только максимальное значение. –

+0

Я думаю, что это будет сделано. отношение - это только 1 строка в стандартном_таблице, которая объединяется в 1 из каждого имени поля в EAV, поэтому этого должно быть достаточно, проверит его сейчас –

+0

@ ZafarMalik. , , Если вы предпочитаете, вы можете использовать 'GROUP_CONCAT()' вместо 'MAX()'. Модели EAV обычно имеют одно значение для имени поля, за исключением некоторых известных полей. –

0

Другой ответ при условии, был вдохновением для этого, однако я ниже запрос я использовал:

SELECT st.id, st.first_name, st.last_name, 
    (CASE WHEN `EAV`.`field_name` = 'fieldname1' THEN `EAV`.`field_value` END) AS 'fieldname1', 
    (CASE WHEN `EAV`.`field_name` = 'fieldname2' THEN `EAV`.`field_value` END) AS 'fieldname2', 
FROM standard_table st JOIN 
EAV 
ON EAV.id = st.id 
GROUP BY st.id; 
+0

Я обнаружил, что это фактически вызвало проблему, когда псевдоним переопределяет значение после его обнаружения –

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