还有比这更好/更快的代码吗?它显示了作者曾经在

时间:2011-04-20 作者:EnexoOnoma

我有一个显示用户发布的类别的查询。例如,如果我有3只猫,名字是新闻、媒体、出版物,而作者只在前两个发布过,它会显示

消息

媒体

有没有比这更好的代码,或者有什么改进,因为我的db真的很大,它会让我感到窒息?非常感谢。

<?php
$author = get_query_var(\'author\');
$categories = $wpdb->get_results("
SELECT DISTINCT(terms.term_id) as ID, terms.name
    FROM $wpdb->posts as posts
    LEFT JOIN $wpdb->term_relationships as relationships ON posts.ID = relationships.object_ID
    LEFT JOIN $wpdb->term_taxonomy as tax ON relationships.term_taxonomy_id = tax.term_taxonomy_id
    LEFT JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
WHERE posts.post_author = \'{$post->post_author}\' ");
?>

<ul>
    <?php foreach($categories as $category) : ?>
<?php if ( ($category->ID == \'3\')   || ($category->ID == \'4\')  || ($category->ID == \'5\')) { ?>
    <li>
        <a href="<?php echo get_category_link( $category->ID ); ?>/?author_name=<?php echo $curuser->user_login; ?>" title="<?php echo $category->name ?>">
            <?php echo $category->name; ?>
        </a>
    </li>
<?php } ?>
    <?php endforeach; ?>
</ul>

2 个回复
最合适的回答,由SO网友:Otto 整理而成

SQL并没有将术语匹配仅限于类别。您还可以获得标签和任何其他分类法。因此,返回的数据可能比预期的要多。

Taxonomy是term\\u Taxonomy表中的一个键,因此消除不需要的分类应该很快。

SELECT DISTINCT(terms.term_id) as ID, terms.name
FROM $wpdb->posts as posts
LEFT JOIN $wpdb->term_relationships as relationships ON posts.ID = relationships.object_ID
LEFT JOIN $wpdb->term_taxonomy as tax ON (relationships.term_taxonomy_id = tax.term_taxonomy_id AND tax.taxonomy = "category")
LEFT JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
WHERE posts.post_author = {$post->post_author}
可能会有帮助。您的DISTINCT还可能导致使用临时表进行排序等。您可以尝试使用GROUP BY,如下所示:

SELECT terms.term_id AS ID, terms.name
FROM $wpdb->posts AS posts
LEFT JOIN $wpdb->term_relationships AS relationships ON posts.ID = relationships.object_ID
LEFT JOIN $wpdb->term_taxonomy AS tax ON ( relationships.term_taxonomy_id = tax.term_taxonomy_id
AND tax.taxonomy =  "category" ) 
LEFT JOIN $wpdb->terms AS terms ON tax.term_id = terms.term_id
WHERE posts.post_author = {$post->post_author}
AND terms.term_id IS NOT NULL 
GROUP BY terms.term_id
可能会得到更好的结果。把它们都设置好,让它们通过phpMyAdmin运行,并让它对它们进行解释,看看哪一个能提供更好的结果。

此外,post\\u author是一个int。您不需要在它周围加引号。

SO网友:Rarst

我并不是SQL方面的专家,但无论您如何处理,这似乎都是资源密集型操作。

另一方面,它看起来不像是一种非常动态的信息类型,所以我的建议是使用Transients API 以获得适当的间隔。

如果更复杂的信息实际上只有在作者发布帖子(或帖子被删除)时才会发生变化,那么您可以有选择地挂接到此类事件中,以重新计算并存储作者的信息。

结束