如何优化这个复杂的EAV MYSQL查询? [英] How to optimize this complicated EAV MYSQL query?
问题描述
是否可以优化我所写的查询
Is it possible to optimize this query I have written
我已经创建了一种动态虚拟数据库,使我的用户能够添加自定义字段而不会影响数据库结构。到目前为止,这是一个非常简化的结构视图。
I've created a sort of dynamic virtual database to give my users the ability to add custom fields without affecting the database structure. Here is a very simplified view of the stucture so far.
tables | columns
db_cases | caseid
db_structure | fieldname
db_data | fieldname, data, caseid
db_names | nameid
- 我们可以通过向db_structure添加一行来创建一个新字段
- 我们希望记录的任何数据记录到db_data。
- 名称存储在db_names中,name_id存储在db_data
我正在尝试将案例输出到html表
I am trying to output the cases to a html table
希望其余的是自我解释,你可以看到它是多么无效。我可以通过连接做同样的事情吗?
Hopefully the rest is self explanatory, you can see how unefficient it is. Can I do the same thing via joins?
SELECT
case_id,
(SELECT data_field_value
FROM db_data
WHERE data_case_id = case_id AND data_field_name = 'casestatus'
) AS casestatus,
(SELECT forename_company
FROM db_names
WHERE name_id = (SELECT data_field_value
FROM db_data
WHERE data_case_id = case_id AND data_field_name = 'client1'
)
) AS client1_forename_company
FROM db_cases
谢谢
推荐答案
实际上,Chibuzo是对的。开始删除它:-))但之前,玩一点,这是一个很好的脑力,像棋或东西: - )
Actually, Chibuzo is right. Start by deleting it :-)) But before, play with it a little, it's a good brain excercise, like chess or something :-)
select
case_id,
d_status.data_field_value as case_status,
d_client1_name.forename_company as client1_forename_company
from db_cases
join db_data as d_status
on d_status.data_case_id = case_id
AND d_status.data_field_name = 'casestatus'
join db_data as d_client1
on d_client1.data_case_id = case_id
AND d_client1.data_field_name = 'client1'
join db_names as d_client1_name
on d_client1_name.name_id = d_client1.data_field_value
我希望这些直接加入没有子查询的效率要高得多,虽然你必须测试它 - 经常会有惊喜的优化。
I would expect these direct joins without subqueries to be much more efficient, though you'll have to test it - there are often surprises in optimizations.
这篇关于如何优化这个复杂的EAV MYSQL查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!