我目前有以下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个表连接。
答案 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;