amof
amof

Reputation: 416

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

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 

Thanks

Upvotes: 3

Views: 1855

Answers (1)

Tomas
Tomas

Reputation: 59483

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.

Upvotes: 2

Related Questions