Как лучше делать сложные SQL запросы
-
Доброй ночи. Прошу совета у вас мужики.
Строю я сайт с нестандартными выборками из базы данных — сложные запросы стандартное api wp_query не может мне предоставить то что мне нужно без потери производительности (как по моему мнению).Но стоил я такие запросы через wp_query т.к. человек свыше меня стоящий сказал, никаких $wpdb он не кеширует запросы только wp_query.
Ок. начал я делать через wp_query — здесь мне посоветовали фильтры
‘posts_fields’, ‘posts_join’,’posts_where’,’posts_orderby’ которые отлично справлялись с тем как я задумывал.
изменял я запрос так$mam_global_fields = ' pm2.meta_value as product_id'; $mam_global_join = " INNER JOIN $wpdb->postmeta AS pm2 ON ({$wpdb->posts}.ID = pm2.post_id)"; $mam_global_where = " AND pm2.meta_key = 'b_product_id' "; $args = array( 'post_type' => 'salon_product', 'meta_query' => array( array( 'key' => 'sp_salon', 'value' => $post->ID ) ), 'posts_per_page' => -1, ); $products_query = new WP_Query($args);
Вроде бы работало нормально, но потом начали замечать что где то товары не выведутся, где то пропадут, оказалось то что wp_query кешировал по атрибутам. Исправил этот момент с помощью добавления атрибутов (‘name_cache’,’md5_arrts_cache’) в $args
$args = array( 'post_type' => 'salon_product', 'meta_query' => array( array( 'key' => 'sp_salon', 'value' => $post->ID ) ), 'name_cache' => 'single-salon', 'md5_arrts_cache' => hg_md5_query_cache() //$mam которые sql запрос изменяют );
Эти атрибуты играли лишь роль уникального ключа кеша для измененных запросов.
Но как по моему разработка и модернизация такого кода уж слишком сложна в плане гибкости / мобильности.
Одно дело когда такая выборка
$args = array( 'post_type' => 'salon_product', 'meta_query' => array( array( 'key' => 'sp_salon', 'value' => $post->ID) ), );
все ясно и понятно. Можно использовать конечно по 3-6 wp_query запросов + множество циклов чтобы все это сравнить отсеить, но по-моему это противоречит оптимизации.
Подскажите как выйти из ситуации
Вот пример одного из крупных sqlSELECT SQL_CALC_FOUND_ROWS wp_posts.*, pm2.meta_value AS product_id, p2.post_name AS product_slug FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) INNER JOIN wp_postmeta AS pm2 ON (wp_postmeta.post_id = pm2.post_id) INNER JOIN wp_posts AS p2 ON (p2.ID = pm2.meta_value) INNER JOIN wp_term_relationships ON (pm2.meta_value = wp_term_relationships.object_id) INNER JOIN wp_term_relationships AS tr2 ON ( pm2.meta_value = tr2.object_id ) WHERE 1=1 AND wp_posts.post_type = 'salon_product' AND (wp_posts.post_status = 'publish') AND ( (wp_postmeta.meta_key = 'sp_salon' AND CAST(wp_postmeta.meta_value AS CHAR) = '8723') ) AND pm2.meta_key = 'sp_product_id' AND ( wp_term_relationships.term_taxonomy_id IN (492) ) AND tr2.term_taxonomy_id IN ( 339, 342 ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date
- Тема «Как лучше делать сложные SQL запросы» закрыта для новых ответов.