2012-05-10 37 views
1

我需要一些查询的帮助,该查询应该根据他们的wp-postratings分数返回帖子(http://wordpress.org/extend/plugins/wp-postratings/)。关于wordpress元数据的MySQL查询

用户选择最低评分(0至5星)和最高评分(0至5星),并且查询应该返回匹配的帖子。我已经在两个值的用户输入都在0以上的地方工作,但我似乎无法绕过0值。由于0代表未评级帖子 - 因此没有评级元数据 - 因此我不仅需要选择评级不超过指定最大值的帖子,还要选择没有评级元数据的每篇帖子。

我该怎么做?任何帮助将非常感谢!

这里是我当前的查询:

SELECT DISTINCT p.*, (t1.meta_value+0.00) AS ratings_average, (t2.meta_value+0.00) AS ratings_users, (t3.meta_value+0.00) AS ratings_score 
FROM wp_posts p 
INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id) 
INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) 
INNER JOIN wp_terms t ON t.term_id = tt.term_id 
LEFT JOIN wp_postmeta AS t1 ON t1.post_id = p.ID 
LEFT JOIN wp_postmeta AS t2 ON t1.post_id = t2.post_id 
LEFT JOIN wp_postmeta AS t3 ON t3.post_id = p.ID 
WHERE t1.meta_key = 'ratings_average' 
AND t2.meta_key = 'ratings_users' 
AND t3.meta_key = 'ratings_score' 
AND p.post_date < NOW() 
AND p.post_status = 'publish' 
AND (tt.taxonomy = 'post_tag' AND tt.term_id = t.term_id AND t.slug = 'liverpool') 
AND ((t1.meta_value+0.00) IS NULL OR (t1.meta_value+0.00) <= $max_stars) 
ORDER BY p.post_date DESC 
LIMIT 20 

回答

1

好的,这个查询似乎适用于我。它有点丑陋,但不是太快,所以如果有人有更好的人可以随时改善它!

它选择的所有额定职位,低于$ MAX_STARS值,则结合了独立选择的表,得到所有非额定职位:

(SELECT DISTINCT p.*, (t1.meta_value+0.00) AS ratings_average, (t2.meta_value+0.00) AS ratings_users, (t3.meta_value+0.00) AS ratings_score 
FROM wp_posts p 
INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id) 
INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) 
INNER JOIN wp_terms t ON t.term_id = tt.term_id 
LEFT JOIN wp_postmeta AS t1 ON t1.post_id = p.ID 
LEFT JOIN wp_postmeta AS t2 ON t2.post_id = p.ID 
LEFT JOIN wp_postmeta AS t3 ON t3.post_id = p.ID 
WHERE t1.meta_key = 'ratings_average' 
AND t2.meta_key = 'ratings_users' 
AND t3.meta_key = 'ratings_score' 
AND p.post_date < NOW() 
AND p.post_status = 'publish' 
AND (tt.taxonomy = 'post_tag' AND tt.term_id = t.term_id AND t.slug = 'liverpool') 
AND (t1.meta_value+0.00) <= $max_stars) 

UNION 

(SELECT DISTINCT p.*, NULL AS ratings_average, NULL AS ratings_users, NULL AS ratings_score 
FROM wp_posts p 
INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id) 
INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) 
INNER JOIN wp_terms t ON t.term_id = tt.term_id 
LEFT JOIN wp_postmeta AS t1 ON (t1.post_id = p.ID AND t1.meta_key = 'ratings_score') 
WHERE t1.post_id is null 
AND p.post_date < NOW() 
AND p.post_status = 'publish' 
AND (tt.taxonomy = 'post_tag' AND tt.term_id = t.term_id AND t.slug = 'liverpool')) 

ORDER BY post_date DESC 
1

我不得不做类似的东西了一段时间后,我正在运行一个cron作业送岗位到没有已注册的其他应用程序。我发现的最好的方法是编写一个查询,检查ID是否不在使用元键的帖子查询中。

SELECT $wpdb->posts.ID 
FROM $wpdb->posts 
WHERE $wpdb->posts.post_status = 'publish' 
AND $wpdb->posts.post_type = 'post' 
AND $wpdb->posts.ID NOT IN (
    SELECT $wpdb->posts.ID 
    FROM $wpdb->posts 
    left join $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) 
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->postmeta.meta_key = 'meta_key') 

我相信这应该工作,但我显然没有测试过它。

SELECT DISTINCT p.*, (t1.meta_value+0.00) AS ratings_average, (t2.meta_value+0.00) AS ratings_users, (t3.meta_value+0.00) AS ratings_score 
FROM wp_posts p 
INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id) 
INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) 
INNER JOIN wp_terms t ON t.term_id = tt.term_id 
LEFT JOIN wp_postmeta AS t1 ON t1.post_id = p.ID 
LEFT JOIN wp_postmeta AS t2 ON t1.post_id = t2.post_id 
LEFT JOIN wp_postmeta AS t3 ON t3.post_id = p.ID 
WHERE t1.meta_key = 'ratings_average' 
AND t2.meta_key = 'ratings_users' 
AND t3.meta_key = 'ratings_score' 
AND p.post_date < NOW() 
AND p.post_status = 'publish' 
AND (tt.taxonomy = 'post_tag' 
AND tt.term_id = t.term_id 
AND t.slug = 'liverpool') 
AND ( 
p.ID NOT IN (
    SELECT p.ID 
    FROM wp_posts AS p 
    LEFT JOIN wp_postmeta AS pm ON (pm.post_id = p.ID) 
    WHERE pm.meta_key = 'ratings_score' 
) 
OR 
(t1.meta_value+0.00) <= $max_stars) 
ORDER BY p.post_date DESC 
LIMIT 20 
+0

感谢您的答复!不幸的是,这个查询只返回那些已经评分过的。 – martynr