Как оптимизировать этот сложный запрос EAV MYSQL? - PullRequest
3 голосов
/ 02 апреля 2012

Можно ли оптимизировать этот запрос, который я написал

Я создал своего рода динамическую виртуальную базу данных, чтобы мои пользователи могли добавлять настраиваемые поля, не влияя на структуру базы данных.Пока это очень упрощенный вид структуры.

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 

Спасибо

1 Ответ

2 голосов
/ 02 апреля 2012

На самом деле, Чибузо прав.Начните с удаления :-)) Но прежде, немного поиграйте с ним, это хорошая тренировка мозга, например, шахматы или что-то в этом роде: -)

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

Я ожидаю, что эти прямые объединения без подзапросов будут многоболее эффективный, хотя вам придется его тестировать - оптимизация часто бывает неожиданной.

...