How do I perform a between Query on a DB that all ready has multiple joins?
I am trying to write a query to check if the custom meta values in a custom post type(properties) when saved equals the meta values in another custom post type(alerts)
I can get this work for normal match fields however I am trying to get it to work for a range for example, if 'bedrooms' in 'properties' is between 'a_bedrooms_min' and 'a_bedrooms_max' in 'alerts'. My Query looks like this so far:
//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;
The last two ANDs obviously will not work with what I am trying to do but how would can get this to work?
I think you are close. you have a hybrid old ANSI vs more explicit JOIN. As you can see in this example, each one of the 3 criteria is joined to the meta table on all 3 parts explicitly. So, the ID should only appear ONCE per ID as each of the meta SHOULD AT MOST return one record, and the record will only qualify if all 3 meta find the respective match.
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;
I've revised as I believe the <= and >= were actually backwards. For example, your MINIMUM bedrooms from the meta_value was 1 and max is 3... you are LOOKING for 2 to be qualified.
So, you NEED MIN_BEDROOMS <= 2 and the 2 <= MAX_BEDROOMS what was originally presented is MIN_BEDROOMS >= 2 (1 is never greater than 2) and MAX_BEDROOMS <= 2 (2 is never less than 2).