【发布时间】:2017-09-18 10:20:41
【问题描述】:
我正在为 wordpress 中的帖子开发一个过滤器,它使用来自 postmeta 的数据: 我的日期过滤器正在工作并给我这个查询:
工作查询结果:
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?
任何帮助将不胜感激。
【问题讨论】:
-
您正在过滤(即删除不匹配的记录),因此 LEFT OUTER JOIN 没有任何意义。
-
我已经更新了我的帖子/问题,因为我可以删除左连接或内连接,在这两种情况下它都会给我结果。但我仍然不知道如何从我的 SQL 语句中删除其中的 1 个连接。
-
您在“wp_postmeta”表中没有数据,但在“wp_posts”中有相同的数据。也许您需要考虑一下为什么“wp_postmeta”中没有此 post_id 的数据?
-
可能是因为“'compare' => '='”?
-
wp_postmeta中有数据,而cust_id不在wp_posts中,通过postmeta中的post_id链接到posts中的id
标签: php mysql wordpress join filter