1

wp-postratings スコア (http://wordpress.org/extend/plugins/wp-postratings/) に基づいて投稿を返すクエリについて助けが必要です。

ユーザーが最小評価 (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
4

2 に答える 2

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
于 2012-05-10T07:19:07.243 に答える
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
于 2012-05-10T21:14:35.777 に答える