-1
SELECT wposts.*, wpostmeta.* 
FROM wp_posts wposts, wp_postmeta wpostmeta, wp_postmeta wpostmeta2, wp_postmeta wpostmeta3 
WHERE 
      wposts.ID = wpostmeta.post_id 
  AND wposts.ID = wpostmeta2.post_id 
  AND wposts.ID = wpostmeta3.post_id 
  AND wpostmeta.meta_key = 'listing_subtype' 
  AND wpostmeta.meta_value = 'Seattle' 
  AND wpostmeta2.meta_key = 'district' 
  AND wpostmeta2.meta_value = 'Breadview' 
  AND wpostmeta3.meta_key = 'price_current' 
  AND wpostmeta3.meta_value BETWEEN 0 AND 800000
  AND wposts.post_status = 'publish' 
  AND wposts.post_type = 'vreb_property' 
ORDER BY wposts.post_date DESC 
LIMIT 0, 20

私は今このクエリを見ていて、おそらく効率を改善する必要があると考えています。そして、私は非常に多くのバリエーションを試してきたので、SO の入力を求めるのが最善だと思います。

4

1 に答える 1

0

これをgroup byandhaving句で行います。投稿のリストを取得するには:

select p.id
from wp_post_meta p
group by p.id
having sum(case when p.meta_key = 'listing_subtype' and p.meta_value = 'Seattle' 
                then 1 else 0 end) > 0 and
       sum(case when p.meta_key = 'district' and p.meta_value = 'Breadview'
                then 1 else 0 end) > 0 and
       sum(case when p.meta_key = 'price_current' and cast(p.meta_value as float) BETWEEN 0 AND 800000
                then 1 else 0 end) > 0

注: これはテストされていないため、構文エラーがある可能性があります。

すべての情報を取得するには、投稿を結合します。

select p.*
from wp_posts p join
     (select p.id
      from wp_post_meta p
      group by p.id
      having sum(case when p.meta_key = 'listing_subtype' and p.meta_value = 'Seattle' 
                      then 1 else 0 end) > 0 and
             sum(case when p.meta_key = 'district' and p.meta_value = 'Breadview'
                      then 1 else 0 end) > 0 and
             sum(case when p.meta_key = 'price_current' and cast(p.meta_value as float) BETWEEN 0 AND 800000
                      then 1 else 0 end) > 0
    ) p2
    on p.id = p2.id
于 2013-02-26T00:05:56.177 に答える