2012-05-10 10 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