Поддержка Проблемы и решения Как лучше делать сложные 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 запросов + множество циклов чтобы все это сравнить отсеить, но по-моему это противоречит оптимизации.

    Подскажите как выйти из ситуации
    Вот пример одного из крупных sql

    SELECT 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 запросы» закрыта для новых ответов.