Как оптимизировать этот сложный запрос EAV MYSQL?
Можно ли оптимизировать этот запрос, который я написал?
Я создал своего рода динамическую виртуальную базу данных, чтобы мои пользователи могли добавлять настраиваемые поля, не влияя на структуру базы данных. Вот очень упрощенный взгляд на структуру до сих пор.
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 ответ
На самом деле, Чибузо прав. Начните с удаления:-)) Но перед этим поиграйте с ним немного, это хорошая тренировка мозга, например, шахматы или что-то в этом роде:-)
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
Я ожидал бы, что эти прямые объединения без подзапросов будут намного более эффективными, хотя вам придется проверять это - в оптимизациях часто бывают сюрпризы.