我目前有以下 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;
随着您获得越来越多的列,这可以比数十个联接执行得更好。
关于php - 没有连接的 EAV 表选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31338549/