我使用此代码来选择帖子数
$select = SELECT COUNT( DISTINCT wpPost.ID )
FROM `wp_posts` wpPost
RIGHT JOIN `wp_woocommerce_order_itemmeta` wpOrderItem
ON wpOrderItem.`meta_value`='6246'
WHERE wpPost.`post_status`='wc-completed'
GROUP BY wpPost.`ID`
ORDER BY wpPost.`post_date` DESC
$wpdb->get_results("$select");
echo $wpdb->num_rows;
但是这段代码很慢很长,大约40秒!
wp_woocommerce_order_itemmeta
有388116条记录
答案 0 :(得分:0)
只有绝对必要时才应使用DISTINCT的一个原因 必须对结果集进行排序才能查找和删除 重复
我不确定您的查询为什么需要很长时间,但我有一个解决方法,通过删除与查询不同来计算总数。
任意选择保留最低ID。另外,请避免使用隐式连接语法。
您的查询应该是:
SELECT COUNT( wpPost.ID ), MIN( wpPost.ID)
FROM `wp_posts` wpPost
RIGHT JOIN `wp_woocommerce_order_itemmeta` wpOrderItem
ON wpOrderItem.`meta_value`='6246'
WHERE wpPost.`post_status`='wc-completed'
GROUP BY wpPost.`ID`
ORDER BY wpPost.`post_date` DESC
答案 1 :(得分:0)
我首先要添加以下索引来优化此查询:
ALTER TABLE
`wp_posts`
ADD
INDEX `wp_posts_index_1` (`post_status`, `ID`);
ALTER TABLE
`wp_woocommerce_order_itemmeta`
ADD
INDEX `wp_woocommerce_order_itemmeta_index_1` (`meta_value`);