[wp-trac] [WordPress Trac] #29604: Meta query OR and meta key sort generate incorrect WHERE clause
WordPress Trac
noreply at wordpress.org
Sun Oct 19 17:41:36 UTC 2014
#29604: Meta query OR and meta key sort generate incorrect WHERE clause
--------------------------+------------------------------
Reporter: Pwhitehurst | Owner:
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Query | Version: 4.0
Severity: normal | Resolution:
Keywords: | Focuses:
--------------------------+------------------------------
Description changed by boonebgorges:
Old description:
> I have the following arguments
>
> $args3 = array(
> 'post_type' => 'match',
> 'orderby' => 'meta_value',
> 'meta_key' => 'match_date',
> 'order' => 'ASC',
> 'meta_query' => array(
>
> array(
> 'key' => 'home_team',
> 'value' => $teamID,
> 'compare' => '=' ,
>
> ),
> 'relation' => 'OR',
> array(
> 'key' => 'away_team',
> 'value' => $teamID,
> 'compare' => '=' ,
>
> ),
>
> ),
>
> );
>
> Generates the following SQL which incorrectly OR's the match_date with
> home_team and away_team
>
> REQUEST:SELECT SQL_CALC_FOUND_ROWS deece_posts.ID FROM deece_posts
> INNER JOIN deece_postmeta ON deece_posts.ID = deece_postmeta.post_id
> INNER JOIN deece_postmeta AS mt1 ON (deece_posts.ID = mt1.post_id)
> INNER JOIN deece_postmeta AS mt2 ON (deece_posts.ID = mt2.post_id) WHERE
> 1=1 AND deece_posts.post_type = 'match' AND (deece_posts.post_status =
> 'publish' OR deece_posts.post_status = 'private') AND
> (deece_postmeta.meta_key = 'match_date'
> OR (mt1.meta_key = 'home_team' AND CAST(mt1.meta_value AS CHAR) = '120')
> OR (mt2.meta_key = 'away_team' AND CAST(mt2.meta_value AS CHAR) = '120')
> ) GROUP BY deece_posts.ID ORDER BY deece_postmeta.meta_value ASC LIMIT 0,
> 10
>
>
> It should generate the following SQL with an additional AND and
> parentheses around the OR condition in the where , as below.
>
> REQUEST:SELECT SQL_CALC_FOUND_ROWS deece_posts.ID FROM deece_posts
> INNER JOIN deece_postmeta ON deece_posts.ID = deece_postmeta.post_id
> INNER JOIN deece_postmeta AS mt1 ON (deece_posts.ID = mt1.post_id)
> INNER JOIN deece_postmeta AS mt2 ON (deece_posts.ID = mt2.post_id) WHERE
> 1=1 AND deece_posts.post_type = 'match' AND (deece_posts.post_status =
> 'publish' OR deece_posts.post_status = 'private') AND
> (deece_postmeta.meta_key = 'match_date' AND
> ( (mt1.meta_key = 'home_team' AND CAST(mt1.meta_value AS CHAR) = '120')
> OR (mt2.meta_key = 'away_team' AND CAST(mt2.meta_value AS CHAR) =
> '120')) ) GROUP BY deece_posts.ID ORDER BY deece_postmeta.meta_value ASC
> LIMIT 0, 10
New description:
I have the following arguments
{{{
$args3 = array(
'post_type' => 'match',
'orderby' => 'meta_value',
'meta_key' => 'match_date',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'home_team',
'value' => $teamID,
'compare' => '=' ,
),
'relation' => 'OR',
array(
'key' => 'away_team',
'value' => $teamID,
'compare' => '=' ,
),
),
);
}}}
Generates the following SQL which incorrectly OR's the match_date with
home_team and away_team
REQUEST:SELECT SQL_CALC_FOUND_ROWS deece_posts.ID FROM deece_posts INNER
JOIN deece_postmeta ON deece_posts.ID = deece_postmeta.post_id
INNER JOIN deece_postmeta AS mt1 ON (deece_posts.ID = mt1.post_id)
INNER JOIN deece_postmeta AS mt2 ON (deece_posts.ID = mt2.post_id) WHERE
1=1 AND deece_posts.post_type = 'match' AND (deece_posts.post_status =
'publish' OR deece_posts.post_status = 'private') AND
(deece_postmeta.meta_key = 'match_date'
OR (mt1.meta_key = 'home_team' AND CAST(mt1.meta_value AS CHAR) = '120')
OR (mt2.meta_key = 'away_team' AND CAST(mt2.meta_value AS CHAR) = '120')
) GROUP BY deece_posts.ID ORDER BY deece_postmeta.meta_value ASC LIMIT 0,
10
It should generate the following SQL with an additional AND and
parentheses around the OR condition in the where , as below.
REQUEST:SELECT SQL_CALC_FOUND_ROWS deece_posts.ID FROM deece_posts INNER
JOIN deece_postmeta ON deece_posts.ID = deece_postmeta.post_id
INNER JOIN deece_postmeta AS mt1 ON (deece_posts.ID = mt1.post_id)
INNER JOIN deece_postmeta AS mt2 ON (deece_posts.ID = mt2.post_id) WHERE
1=1 AND deece_posts.post_type = 'match' AND (deece_posts.post_status =
'publish' OR deece_posts.post_status = 'private') AND
(deece_postmeta.meta_key = 'match_date' AND
( (mt1.meta_key = 'home_team' AND CAST(mt1.meta_value AS CHAR) = '120')
OR (mt2.meta_key = 'away_team' AND CAST(mt2.meta_value AS CHAR) = '120'))
) GROUP BY deece_posts.ID ORDER BY deece_postmeta.meta_value ASC LIMIT 0,
10
--
--
Ticket URL: <https://core.trac.wordpress.org/ticket/29604#comment:1>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list