EAV表选择没有连接

时间:2015-07-10 10:30:49

标签: php mysql join entity-attribute-value

我目前有以下EAV表:

id
field_name
field_value

标准表:

id
first_name
last_name

我将标准表加入到EAV表中,以获取与ID匹配的每个值,因此我的查询看起来像这样:

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');

这一直运行良好,直到今天我现在在我的EAV表中有62个自定义字段,这意味着我的查询加入了62个表,因此达到MySQL表连接限制并失败。

整个查询似乎是一种糟糕的方式,我怎样才能重写它,因此它更快,并且不需要62个表连接。

2 个答案:

答案 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;

随着越来越多的列,这可以比几十个连接更好。

答案 1 :(得分: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;