0

Wordpress内でアラートを設定して、ユーザーがアラートを作成できるようにしようとしています。これにより、作成された新しい投稿(プロパティ)が設定された基準(アラート)に一致したときに通知が届きます。私の計画は、プロパティ用とアラート用の2つの投稿タイプを使用してこれを行うことでした。次に、プロパティの投稿が保存されると、次のクエリ例が実行されます。

SELECT 
    post_author
    FROM 
        wp_posts
    INNER JOIN wp_postmeta m1
        ON wp_posts.ID = m1.post_id
        AND m1.meta_key = 'a_property_type'
        AND m1.meta_value = 'flat'
    INNER JOIN wp_postmeta m2
        on wp_posts.ID = m2.post_id
        AND m2.meta_key = 'a_bedrooms_min' 
        AND m2.meta_value <= '2'
    INNER JOIN wp_postmeta m3
        on wp_posts.ID = m3.post_id
        AND m3.meta_key = 'a_bedrooms_max' 
        AND m3.meta_value >= '2'
    INNER JOIN wp_postmeta m4
        on wp_posts.ID = m4.post_id
        AND m4.meta_key = 'a_bathrooms_min' 
        AND m4.meta_value <= '2'
    INNER JOIN wp_postmeta m5
        on wp_posts.ID = m5.post_id
        AND m5.meta_key = 'a_bathrooms_max' 
        AND m5.meta_value >= '2'      
    INNER JOIN wp_postmeta m6
        on wp_posts.ID = m6.post_id
        AND m6.meta_key = 'a_garden' 
        AND m6.meta_value >= '1'        
    INNER JOIN wp_postmeta m7
        on wp_posts.ID = m7.post_id
        AND m7.meta_key = 'a_garage' 
        AND m7.meta_value >= '1'    
    INNER JOIN wp_postmeta m8
        on wp_posts.ID = m8.post_id
        AND m8.meta_key = 'a_parking' 
        AND m8.meta_value >= '1'        
    INNER JOIN wp_postmeta m9
        on wp_posts.ID = m9.post_id
        AND m9.meta_key = 'a_double_glazing' 
        AND m9.meta_value >= '1'    
    INNER JOIN wp_postmeta m10
        on wp_posts.ID = m10.post_id
        AND m10.meta_key = 'a_country' 
        AND m10.meta_value LIKE 'Scotland'        
    WHERE
        wp_posts.post_type = 'alerts'
        AND wp_posts.post_status = 'publish'
    GROUP BY 
       wp_posts.ID
    ORDER BY 
        wp_posts.post_date DESC

これは機能し、設定された基準に一致するプロパティを返しますが、LIKEを導入すると、クエリが実際にハングします。デフォルトのWordpressテーブル「wp_posts」と「wp_postmeta」を使用しています。'meta_value'列にインデックスを設定しようとしましたが、'longtext'フィールドであるため、設定できません。

これを行うためのより良い解決策はありますか、それとも私のクエリをより効率的に書くことができますか?

ありがとう

4

1 に答える 1

1

egyalが提供したものとは別に、私も(post_id、meta_key、meta_value)にインデックスを追加します。それがあなたの質問に役立たないなら、私はもう一つ試してみます。LIKEを除くすべての要素をプリクエリにプリラップして、内部クエリが最初に処理され、非常に小さなIDのセットを返し、次にLIKE条件に参加します。

1000個のプロパティがありますが、他のすべての基準に適合するのは35個だけで、1秒未満で解決されるとします。これで、追加のLIKE条件に対して試行されるレコードは35個だけになります。何かのようなもの

select
      wp.Post_Author
   from
      ( SELECT 
              post_id,
              post_author
           FROM 
              wp_posts
                 INNER JOIN wp_postmeta m1
                    ON wp_posts.ID = m1.post_id
                   AND m1.meta_key = 'a_property_type'
                 INNER JOIN the m2 through m9 
           WHERE
               type and status criteria ) as PreQuery
      INNER JOIN your m10 version
         on  PreQuery.Post_ID = m10.post_id
        AND ... rest of join condition
于 2012-12-02T22:06:27.157 に答える