【发布时间】:2016-02-09 17:52:41
【问题描述】:
你能帮我写一个困难的查询来计算 wordpress 上的帖子数吗?
情况是这样的:
wordpress 网站上有一个广告系统和搜索(过滤)。
主页显示所有类别的列表以及每个类别中的广告数量。
- 用户以城市、广告类型和关键字的形式输入。他可以输入所有参数,也可以只输入其中一个。
- 脚本应显示每个类别中的广告数量。
我的脚本可以运行,但速度非常慢。
<?php
$querystr = "SELECT * FROM $wpdb->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 (wp_term_taxonomy.term_id = ".$category->cat_ID." AND wp_term_taxonomy.taxonomy = 'category'
AND wp_posts.post_type = 'post'
AND wp_posts.post_status = 'publish')";
$pageposts = $wpdb->get_results($querystr, OBJECT);
$count=0;
foreach($pageposts as $post) {
setup_postdata($post);
$today = date('Y-m-d H:i:S');
$validity = get_post_meta($post->ID, 'valid_until', true);
$city = get_post_meta($post->ID, 'post_location', true);
$action = get_post_meta($post->ID, 'post_action', true);
$cities = explode("|", $city);
$session_city = $_SESSION["session_city"];
if($_SESSION["session_city"] and !$_SESSION["session_action"] or $_SESSION["session_action"]=='All') {
if($validity >= $today and in_array($session_city, $cities)) { $count++;}
}
if($_SESSION["session_action"] and !$_SESSION["session_city"] or $_SESSION["session_city"]=='All') {
if($validity >= $today and $action == $_SESSION["session_action"]) { $count++;}
}
if($_SESSION["session_action"] and $_SESSION["session_city"]) {
if($validity >= $today and $action == $_SESSION["session_action"] and in_array($session_city, $cities)) { $count++;}
}
if(!isset($_SESSION["session_city"]) and !isset($_SESSION["session_action"])) {
if($validity >= $today) { $count++;}
}
}
echo $count;
?>
【问题讨论】:
-
除了删除邪恶的 'SELECT *' 之外,这个查询没有什么可以做的。大概一切都被正确索引了吗?解释说什么?
-
计数不就等于返回的行数吗?
-
当我使用 foreach 使用 php 计算广告时的缓慢部分。
-
你分析过它吗?
-
我投票结束这个问题,因为它是关于工作代码的优化,它更适合Code Review 或Database Administrators