我目前有以下EAV表:
id
field_name
field_value
和标准表格:
id
first_name
last_name
对于与ID匹配的每个值,我将标准表连接到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');
这一直工作得很好,直到今天,我现在在我的EAV表中有62个自定义字段,这意味着我的查询连接到62个表,因此达到MySQL表连接限制并失败。
整个查询似乎是一个糟糕的方式做它,我如何重写这个,使它更快,不需要62表连接
您还可以对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;
当您有越来越多的列时,这可以比几十个连接执行得更好。
另一个提供的答案是这个的灵感,但下面是我实际使用的查询:
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;