Выборка нескольких таксономий MySQL

Каюсь, все через недостаток знаний MySQL-запросов, но может все-таки кто-то может подсказать, как используя подобный код

SELECT * 
FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
WHERE $wpdb->posts.post_type = 'post' 
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->terms.slug = 'programming'
ORDER BY $wpdb->posts.post_date DESC

можно сделать выборку по двум таксономиям (двум термам разных таксономий), Например выбрать все записи рубрики Программирование, которые обозначены термом PHP таксономии ЯЗЫКИ. Проблема в том, что я просто не знаю как коректно присобачить новые условия. Просто добавив после

AND $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->terms.slug = 'programming'

такую часть

AND $wpdb->term_taxonomy.taxonomy = 'languages'
AND $wpdb->terms.slug = 'php'

?

Нужно именно через MySQL? В WordPress 3.1 можно так:

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'category',
            'field' => 'slug',
            'terms' => 'programming'
        ),
        array(
            'taxonomy' => 'languages',
            'field' => 'slug',
            'terms' => 'php'
        )
    )
);
query_posts($args);
Нужно именно через MySQL? В WordPress 3.1 можно так:
$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'category',
            'field' => 'slug',
            'terms' => 'programming'
        ),
        array(
            'taxonomy' => 'languages',
            'field' => 'slug',
            'terms' => 'php'
        )
    )
);
query_posts($args);

Не, через query_post мы и сами умеем 🙂
Интересуют как раз тонкости MySQL-запроса…

Проблема в том, что я просто не знаю как коректно присобачить новые условия.

Например, так:

SELECT * 
FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships tr1 ON($wpdb->posts.ID = tr1.object_id)
LEFT JOIN $wpdb->term_relationships tr2 ON($wpdb->posts.ID = tr2.object_id)
LEFT JOIN $wpdb->term_taxonomy tt1 ON(tr1.term_taxonomy_id = tt1.term_taxonomy_id)
LEFT JOIN $wpdb->term_taxonomy tt2 ON(tr2.term_taxonomy_id = tt2.term_taxonomy_id)
LEFT JOIN $wpdb->terms t1 ON(tt1.term_id = t1.term_id)
LEFT JOIN $wpdb->terms t2 ON(tt2.term_id = t2.term_id)
WHERE $wpdb->posts.post_type = 'post' 
AND $wpdb->posts.post_status = 'publish'
AND tt1.taxonomy = 'category'
AND t1.slug = 'programming'
AND tt2.taxonomy = 'languages'
AND t2.slug = 'php'
ORDER BY $wpdb->posts.post_date DESC
Интересуют как раз тонкости MySQL-запроса...

Почему, если не секрет? 🙂

Несколько причин
1. у меня уже есть готовый достаточно сложный код (написанный создателем данного форума) с несколькомим вложенными циклами перебора массивов с данными mysql – запросов, и чтобы все наново не переписывать и не поломать весь механизм я подумал что легче присобачить нужные дополнительные условия.
2. Насколько я понимаю такой код является боллее оптимальным по сравнению со стандартными запросами движка, если выбирать только то что нужно (например вместо * можно указать что именно запрашивать для постов. Ну, вы в курсе 🙂 )
3. Для общего развития. 😀

Cпасибо! Завтра попробую ваш вариант!

SELECT * 
FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships tr1 ON($wpdb->posts.ID = tr1.object_id)
LEFT JOIN $wpdb->term_relationships tr2 ON($wpdb->posts.ID = tr2.object_id)
LEFT JOIN $wpdb->term_taxonomy tt1 ON(tr1.term_taxonomy_id = tt1.term_taxonomy_id)
LEFT JOIN $wpdb->term_taxonomy tt2 ON(tr2.term_taxonomy_id = tt2.term_taxonomy_id)
LEFT JOIN $wpdb->terms t1 ON(tt1.term_id = t1.term_id)
LEFT JOIN $wpdb->terms t2 ON(tt2.term_id = t2.term_id)
WHERE $wpdb->posts.post_type = 'post' 
AND $wpdb->posts.post_status = 'publish'
AND tt1.taxonomy = 'category'
AND t1.slug = 'programming'
AND tt2.taxonomy = 'languages'
AND t2.slug = 'php'
ORDER BY $wpdb->posts.post_date DESC

Почему, если не секрет? 🙂

Спасибо, работает!

Решил усложнить задание, и получать с одной таксономии по слагу, а с другой по айди терма, но опять таки наверное в виду отсутсвия полного понмания как работает запрос, простое переписывание slug на id не помогло. Тогда сделал ухищрение:

$thiscatid = 4;
$qterm = get_term_by('id', $thiscatid, 'category');
$catidforthis = $qterm->slug; 

 $querystr = 
   
                        "SELECT DISTINCT post_title, ID, post_content, post_date
FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships tr1 ON($wpdb->posts.ID = tr1.object_id)
LEFT JOIN $wpdb->term_relationships tr2 ON($wpdb->posts.ID = tr2.object_id)
LEFT JOIN $wpdb->term_taxonomy tt1 ON(tr1.term_taxonomy_id = tt1.term_taxonomy_id) 
LEFT JOIN $wpdb->term_taxonomy tt2 ON(tr2.term_taxonomy_id = tt2.term_taxonomy_id)
LEFT JOIN $wpdb->terms t1 ON(tt1.term_id = t1.term_id)
LEFT JOIN $wpdb->terms t2 ON(tt2.term_id = t2.term_id)
WHERE $wpdb->posts.post_type = 'post' 
AND $wpdb->posts.post_status = 'publish'
AND tt1.taxonomy = 'category'
AND t1.slug = '$catidforthis'
AND tt2.taxonomy = 'themes'
AND t2.slug = 'tema1'


                    GROUP BY $wpdb->posts.ID 
                    ORDER BY post_date DESC 
                    LIMIT 5";

Работает, но вот думаю что все-таки наверное можно как-то в саом запросе запрашивать по айди, чем таким маком, что я нагородил с переделкой айди в слаги… Ведь можно? 🙂

простое переписывание slug на id не помогло

А на term_id?

[quote=Mixa]простое переписывание slug на id не помогло

А на term_id?[/quote]
Ну переписывание AND t1.slug на AND t1.id не сработало 😀

А на t1.term_id? 🙂

Anonymous
Отправить
Ответ на: