我正在为 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'
我的问题是:
如有任何帮助,我们将不胜感激。
由于您要在 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
感谢大家的输入,但事实证明我的编码没有任何问题,显然有一些其他插件在我发送过滤器参数时发送了 GET 参数,当设置此参数时返回 FALSE,我修复了通过在该插件中添加 !EMPTY 来实现它,之后它就像一个魅力。