如何在已有多个连接的数据库上执行查询之间的操作?

时间:2012-12-01 21:07:09

标签: mysql wordpress join

我正在尝试编写一个查询,以检查保存时自定义帖子类型(属性)中的自定义元值是否等于另一个自定义帖子类型(警报)中的元值

我可以将这项工作用于普通匹配字段但是我试图让它适用于某个范围,例如,如果'properties'中的'卧室'位于'警告'中'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;

最后两个AND显然不适用于我想要做的但是如何才能使它工作?

由于 罗伯特

1 个答案:

答案 0 :(得分:1)

我认为你很亲密。你有一个混合的旧ANSI与更明确的JOIN。正如您在此示例中所看到的,3个条件中的每一个都明确地连接到所有3个部分上的元表。因此,ID应该只显示每个ID的ONCE,因为每个元素应该返回一个记录,并且只有当所有3个元找到相应的匹配时,记录才有资格。

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;

我已经修改了,因为我认为&lt; =和&gt; =实际上倒退了。例如,meta_value中的MINIMUM卧室为1,最大值为3 ......您正在寻找2个合格的房间。

所以,你需要MIN_BEDROOMS&lt; = 2和2&lt; = MAX_BEDROOMS 最初呈现的是MIN_BEDROOMS&gt; = 2(1从不大于2) 和MAX_BEDROOMS&lt; = 2(2永远不会少于2)。

再试一次。