@victorib_us

Как оптимизировать такой SQL запрос?

Есть вот такой запрос
SELECT
posts.id,
posts.post_title,
(SELECT meta_value FROM postmeta WHERE meta_key='key_1' AND post_id=posts.id LIMIT 1) as val_1,
(SELECT meta_value FROM postmeta WHERE meta_key='key_2' AND post_id=posts.id LIMIT 1) as val_2,
(SELECT meta_value FROM postmeta WHERE meta_key='key_3' AND post_id=(SELECT meta_value FROM postmeta WHERE meta_key='key_4' AND post_id=posts.id LIMIT 1) LIMIT 1) as val_3
FROM
posts

Он рабочий, но не очень быстрый 0.559 s, для вывода 1000 строк.
Сложность возникла в том, что значения val_1, val_2 и val_3, находятся в одной таблице в поле с общим названием meta_value и отличаются только уже по соседнему полю meta_key. Как этот sql запрос можно сделать более корректным что ли ?
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ответы на вопрос 1
gogametreveli
@gogametreveli
как то так , но третий подзапрос показывает на проблему с проектированием , все это будет работать при условии что в таблице postmeta есть уникальный ключ из двух полей meta_key, post_id
SELECT
posts.id,
posts.post_title,
v1.meta_value  as val_1,
v2.meta_value  as val_2,
(SELECT meta_value FROM postmeta WHERE meta_key='key_3' AND post_id=(SELECT meta_value FROM postmeta WHERE meta_key='key_4' AND post_id=posts.id LIMIT 1) LIMIT 1) as val_3
FROM
posts 
 left join postmeta v1 on (v1.meta_key='key_1' AND v1.post_id=posts.id) 
  left join postmeta v2 on (v2.meta_key='key_2' AND v2.post_id=posts.id)

в идеале должно выглядеть так
SELECT
posts.id,
posts.post_title,
v1.meta_value  as val_1,
v2.meta_value  as val_2,
v3.meta_value  as val_3,

FROM
posts 
  left join postmeta v1 on (v1.meta_key='key_1' AND v1.post_id=posts.id) 
  left join postmeta v2 on (v2.meta_key='key_2' AND v2.post_id=posts.id)     
  left join postmeta v3 on (v2.meta_key='key_3' AND v2.post_id=posts.id)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы