我在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 )
问题要排除的类别。
因此,考虑到我可以自由地做任何事情(比如创建其他“服务”表,如果他们可能有帮助),在这些条件下加速搜索的最佳方法是什么?
答案 0 :(得分:0)
我没有看到子查询的需要,因为它使用的表已经在你的主查询中了!因此,引用内容应该是向WHERE语句添加更多内容的简单问题。
无法编辑你的行
AND wp_term_taxonomy.term_id IN ('1', '49')
到
AND wp_term_taxonomy.term_id IN ('1', '49') AND wp_term_taxonomy.term_id NOT IN ('3394', '49', '794', '183')
..然后完全删除子查询?