0

保存時のカスタム投稿タイプ (プロパティ) のカスタム メタ値が別のカスタム投稿タイプ (アラート) のメタ値と等しいかどうかを確認するクエリを作成しようとしています。

通常の一致フィールドでこれを機能させることができますが、たとえば、「プロパティ」の「ベッドルーム」が「アラート」の「a_bedrooms_min」と「a_bedrooms_max」の間にある場合など、範囲で機能させようとしています。私のクエリはこれまでのところ次のようになっています。

//Property Meta Fields
$meta_type = 'flat';
$meta_bedrooms = '2';

//Alert Meta Fields
a_bedrooms_min = 1
a_bedrooms_max = 3

SELECT ID
    FROM wp_posts
    INNER JOIN wp_postmeta m1
        ON ( wp_posts.ID = m1.post_id )    
    INNER JOIN wp_postmeta m2
        ON ( wp_posts.ID = m2.post_id )
    INNER JOIN wp_postmeta m3
        ON ( wp_posts.ID = m3.post_id )
WHERE
     wp_posts.post_type = 'alerts'
     AND wp_posts.post_status = 'publish'
     AND ( m1.meta_key = 'a_property_type' AND m1.meta_value = '$meta_type' )
     AND ( m2.meta_key = 'a_bedrooms_min' AND m2.meta_value >= '$meta_bedrooms' )
     AND ( m3.meta_key = 'a_bedrooms_max' AND m3.meta_value <= '$meta_bedrooms' )
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date
DESC;

最後の 2 つの AND は、明らかに私がやろうとしていることでは機能しませんが、どうすればこれを機能させることができますか?

ありがとうロバート

4

1 に答える 1

1

近いと思います。ハイブリッドの古い ANSI とより明示的な JOIN があります。この例でわかるように、3 つの条件のそれぞれが、3 つの部分すべてでメタ テーブルに明示的に結合されています。そのため、各メタは最大で 1 つのレコードを返す必要があり、3 つのメタすべてがそれぞれの一致を見つけた場合にのみレコードが適格となるため、ID は ID ごとに 1 回だけ表示されます。

SELECT 
      ID
   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 = '$meta_type'

         INNER JOIN wp_postmeta m2
           on wp_posts.ID = m2.post_id
          AND m2.meta_key = 'a_bedrooms_min' 
          AND m2.meta_value <= '$meta_bedrooms'

         INNER JOIN wp_postmeta m3
           on wp_posts.ID = m3.post_id
          AND m3.meta_key = 'a_bedrooms_max' 
          AND m3.meta_value >= '$meta_bedrooms'

   WHERE
          wp_posts.post_type = 'alerts'
      AND wp_posts.post_status = 'publish'

   GROUP BY 
      wp_posts.ID

   ORDER BY 
      wp_posts.post_date DESC;

<= と >= は実際には逆だったと思うので、修正しました。たとえば、meta_value からの最小寝室数は 1 で、最大寝室数は 3 でした... 2 が適格であることを探しています。

したがって、NEED MIN_BEDROOMS <= 2 および 2 <= MAX_BEDROOMS は、最初に提示されたものは MIN_BEDROOMS >= 2 (1 が 2 より大きくなることはありません) および MAX_BEDROOMS <= 2 (2 が 2 より小さくなることはありません) です。

再試行。

于 2012-12-01T21:28:09.600 に答える