mysql - 如何优化这个复杂的 EAV MYSQL 查询?

标签 mysql sql database-design optimization entity-attribute-value

是否可以优化我写的这个查询

我创建了一种动态虚拟数据库,让我的用户能够在不影响数据库结构的情况下添加自定义字段。这是到目前为止结构的一个非常简化的 View 。

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 表格

希望其余部分是不言自明的,您可以看到它是多么低效。我可以通过连接做同样的事情吗?

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 是对的。从删除它开始 :-)) 但在此之前,稍微玩一下它,这是一种很好的脑力锻炼,比如象棋之类的 :-)

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

我希望这些没有子查询的直接连接会更有效率,尽管您必须对其进行测试 - 优化通常会有惊喜。

关于mysql - 如何优化这个复杂的 EAV MYSQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9981435/

相关文章:

database - 何时分隔数据库列含义(通用列)

php - 在 MySQL 端或 PHP 端对 SQL 数据进行分组?

mysql - 元旦12-2按月选择记录

mysql - HQL 多对多 JOIN 带有额外的列

mysql - 我应该在主关系表中添加总计数吗

php - 通过点击优化内容流行度查询

php - MySql COUNT() 作为字段只返回一个条目

mysql - 将总计数单独计入 M 和 F

php - 安全登录表单,或者至少我希望如此

php - MySQL 连接两个表,其中来自 PHP 变量的 WHERE 语句已经存在