我正在尝试编写一个查询,以检查保存时自定义帖子类型(属性)中的自定义元值是否等于另一个自定义帖子类型(警报)中的元值
我可以将这项工作用于普通匹配字段但是我试图让它适用于某个范围,例如,如果'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显然不适用于我想要做的但是如何才能使它工作?
由于 罗伯特
答案 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)。
再试一次。