WordPress 查询添加了 INNER/LEFT JOIN。为什么或如何删除/防止 INNER/LEFT JOIN?

问题描述 投票:0回答:2

我正在为 WordPress 中的帖子开发一个过滤器,它使用来自 postsmeta 的数据: 我的日期过滤器正在工作并给了我这个查询:

工作查询结果:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
WHERE 1=1 AND YEAR(wp_posts.post_date)=2017 
AND MONTH(wp_posts.post_date)=03 AND wp_posts.post_type = 'projects' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' 
OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' 
OR wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 20

当我按 postmeta.meta_value 过滤时,我得到一个额外的 INNER JOIN ,这导致了问题:

过滤器(不完全有效)

$query->set('meta_query', array(
   array(
      'key' => 'project_cust_id',
      'value' => $project_cust_id,
      'compare' => '=' 
   )
));

查询(无效结果)

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) 
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
WHERE 1=1 AND ( ( wp_postmeta.meta_key = 'project_cust_id' 
AND wp_postmeta.meta_value = '12345' ) ) AND wp_posts.post_type = 'projects' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' 
OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' 
OR wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 20

当我直接在数据库中查询时,我没有得到任何结果,并且出现以下错误,但是当我删除额外的行:

INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
或删除行:
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
时,我确实得到了预期的结果。

编辑:MySQL 返回错误:不是唯一值表/别名:'wp_postmeta'

我的问题是:

  • 为什么我的代码添加了另一个 INNER JOIN?
  • 如何删除/防止这种额外的 INNER JOIN 或 LEFT JOIN?

如有任何帮助,我们将不胜感激。

php mysql wordpress join filter
2个回答
1
投票

由于您要在 where 子句中过滤 wp_postmeta 表中的值,因此

LEFT JOIN
将充当
INNER JOIN
,因为它只会返回在 wp_postmeta 表中具有匹配条件的值。因此,拥有
LEFT JOIN
INNER JOIN
或两者都应该不会产生影响。如果您希望连接像
LEFT JOIN
一样工作,则 wp_postmeta 表的任何条件都应添加到
JOIN
而不是
WHERE
子句中。

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 

FROM   wp_posts 

       LEFT JOIN wp_postmeta 
       ON wp_posts.ID = wp_postmeta.post_id
       AND wp_postmeta.meta_key = 'project_cust_id' 
       AND wp_postmeta.meta_value = '12345'

WHERE  1=1 AND wp_posts.post_type = 'projects' 
       AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' 
       OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' 
       OR wp_posts.post_status = 'private') 

GROUP BY wp_posts.ID 

ORDER BY wp_posts.post_date DESC LIMIT 0, 20

0
投票

感谢大家的输入,但事实证明我的编码没有任何问题,显然有一些其他插件在我发送过滤器参数时发送了 GET 参数,当设置此参数时返回 FALSE,我修复了通过在该插件中添加 !EMPTY 来实现它,之后它就像一个魅力。

© www.soinside.com 2019 - 2024. All rights reserved.