mysql eav_检索MySQL EAV结果作为关系表的最佳性能是什么
我想从EAV(实体属性值)表或更具体地从实体元数据表(如wordpress
wp_posts和wp_postmeta)中提取结果作为“格式正确的关系表”, 以便进行一些排序和/或过滤 。
我找到了一些有关如何在查询中格式化结果的示例(与编写2个查询并将结果连接到代码中相反),但是我想知道这样做的“最有效”方法,尤其是对于较大的结果套。
当我说“最有效”时,是指类似以下情况:
获取所有具有XYZ之类姓氏的实体
返回按生日排序的实体列表
例如打开这个:
** 实体 **
-----------------------
ID | NAME | 随你
-----------------------
1 | 鲍勃 等等
2 | 简| 等等
3 | 汤姆| 等等
**元**
------------------------------------
ID | EntityID | KEY | 值
------------------------------------
1 | 1 | 名| 鲍勃
2 | 1 | 姓| 鲍勃森
3 | 1 | 生日 1983-10-10
。| 2 | 名| 简
。| 2 | 姓| 简斯多特
。| 2 | 生日 1983-08-10
。| 3 | 名| 汤姆
。| 3 | 姓| 汤姆森
。| 3 | 生日 1980-08-10
到这个:
**结果**
-----------------------------------------------
EID | NAME | 名| 姓| 生日
-----------------------------------------------
1 | 鲍勃 鲍勃| 鲍勃森| 1983-10-10
2 | 简| 简| 简斯多特| 1983-08-10
3 | 汤姆| 汤姆| 汤姆森| 1980-08-10
因此我可以按任何元字段进行排序或过滤。
我在这里找到了一些建议,但找不到任何更好的讨论。
选项 :
GROUP_CONCAT :
SELECT e。*,GROUP_CONCAT(CONCAT_WS('||',m.KEY,m.VALUE)ORDER BY m.KEY SEPARATOR';;')
从ENTITY e JOINMETA m在e.ID = m.EntityID
多人加入 :
SELECT e。*,将m1.VALUE用作“名字”,将m2.VALUE用作“姓氏”,将m3.VALUE用作“生日”
来自“ ENTITY” e
左联接META m1
开e.ID = m1.EntityID和m1.meta_key =’名字’
左联接META m2
ON e.ID = m2.EntityID AND m2.meta_key =’姓氏’
左联接META m3
开e.ID = m3.EntityID和m3.meta_key =’生日’
合并 :
选择e。*
,MAX(IF(m.KEY =’名字’,m.VALUE,NULL))作为’名字’
,MAX(IF(m.KEY =’姓氏’,m.VALUE,NULL))作为’姓氏’
,MAX(IF(m.KEY =’birthday’,m.VALUE,NULL))作为’birthday’
来自“ ENTITY” e
加入META m
开启e.ID = m.EntityID
代码 :
从“实体”中选择e。* e其中e.ID = {whatever};
在PHP中,根据结果创建一个占位符对象
从“ META”中选择m。* m,其中m.EntityID = {whatever};
在PHP中,遍历结果并附加到实体对象,例如: $e->{$result->key} = $result->VALUE
一般而言,哪个更适合过滤/排序?
相关问题: