php - 没有连接的 EAV 表选择

标签 php mysql join entity-attribute-value

我目前有以下 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/

相关文章:

php - MySQL 查询的 Union Join 问题

php - 无限滚动 JQuery/PHP(加载页面问题)

mysql - 如何从其他列(带有触发器)中创建计算列?

mysql - 多个 JOIN 与多个 OR 非常慢

MySQL:从多个表中获取数据,允许空值和ID列表

mysql - SQL SELECT 来自多个表或 JOIN

php - 使用表中的一列 1 对列 2 进行排序并使用列 1 作为标题

在 DataTables $columns 数组中使用 date_diff() 函数时出现 PHP 错误

mysql - Twitter 主页/Facebook 墙的数据库结构?

mysql - sql嵌套连接内连接和左连接