У меня есть несколько ящиков на сайте Wordpress, которые должны показывать подборку постов, которые принадлежат к определенным категориям И ТАКЖЕ не принадлежат нескольким другим.Используя только собственные инструменты WordPress, в результате получается запрос, подобный следующему:
SELECT SQL_CALC_FOUND_ROWS wp_posts.*
FROM wp_posts
INNER JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy
ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id)
WHERE 1=1
AND wp_term_taxonomy.taxonomy = 'category'
AND wp_term_taxonomy.term_id IN ('1', '49')
AND wp_posts.ID NOT IN (
SELECT tr.object_id
FROM wp_term_relationships AS tr
INNER JOIN wp_term_taxonomy AS tt
ON tr.term_taxonomy_id = tt.term_taxonomy_id
WHERE tt.taxonomy = 'category'
AND tt.term_id IN ('3394', '49', '794', '183') )
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish')
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 5;
, теперь это довольно дорого и заканчивается в журнале медленных запросов.Поэтому я с удовольствием оставлю WordPress и создам запрос вручную.Во-первых, я могу устранить необходимость в таблице wp_term_taxonomy
(я могу использовать term_taxonomy_id вместо term_id, я никогда не понимал, почему wordpress нуждается в обоих), но у меня все еще есть проблема NOT IT ( SUBQUERY )
из-за исключаемых категорий.
Итак, учитывая, что я могу делать что угодно (например, создавать другие «служебные» таблицы, если они могут помочь), как лучше всего ускорить этот поиск в этих условиях?