0

首先,我想提一下我在 MYSQL 和 JOIN 方面的技能有限。然而,这就是我所拥有的,也是我想要实现的:

我有默认的 WordPress 表,并且喜欢从某个元键中获取包含 post_name、title、status 和 meta_value 的结果。

这就是我所拥有的:

SELECT
    wp_posts.ID, wp_posts.post_name, wp_posts.post_title, wp_posts.post_status, wp_postmeta.meta_value
FROM wp_posts
INNER JOIN
    wp_term_relationships ON ( wp_posts.ID = wp_term_relationships.object_id ) 
INNER JOIN
    wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) 
WHERE (
        wp_term_relationships.term_taxonomy_id
        IN ( 1, 2, 3 )
    )
    AND wp_posts.post_type =  'my_post_type'
    AND (
        wp_posts.post_status
    IN (
        'my_status_1',  'my_status_2'
    )
)
AND wp_postmeta.meta_key =  'my_meta_key'
GROUP BY wp_posts.ID
ORDER BY wp_posts.ID ASC

当每个帖子的 postmeta 为“my_meta_key”时,一切都会按预期工作。但是,如果缺少“my_meta_key”,则该帖子不在结果中。

我猜它是由第二次 INNER JOIN 引起的,但如上所述,我不知道应该用什么替换它。

我确定这很简单

4

3 回答 3

1

移动AND wp_postmeta.meta_key = 'my_meta_key'

INNER JOIN
    wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) 

像这样,将 INNER 更改为 LEFT

    LEFT JOIN
        wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id 
        AND wp_postmeta.meta_key =  'my_meta_key') 

如果您将条件放在“Where 子句”中,则左连接将被“覆盖”。我会添加一个建议。当您真的不需要括号以使代码易于阅读时,请不要使用括号。

于 2013-02-27T16:10:52.727 回答
0

将桌子INNER JOIN上的更改为:wp_postmetaLEFT JOIN

LEFT JOIN wp_postmeta 
    ON ( wp_posts.ID = wp_postmeta.post_id ) 

WHERE并将过滤器移动wp_postmetaJOIN条件。

所以您的查询将是:

SELECT wp_posts.ID, wp_posts.post_name, wp_posts.post_title, wp_posts.post_status, wp_postmeta.meta_value
FROM wp_posts 
INNER JOIN wp_term_relationships 
    ON ( wp_posts.ID = wp_term_relationships.object_id ) 
LEFT JOIN wp_postmeta 
    ON ( wp_posts.ID = wp_postmeta.post_id ) 
    AND wp_postmeta.meta_key =  'my_meta_key'
WHERE wp_term_relationships.term_taxonomy_id IN ( 1, 2, 3 )
    AND wp_posts.post_type =  'my_post_type'
    AND wp_posts.post_status IN ('my_status_1',  'my_status_2')
GROUP BY wp_posts.ID
ORDER BY wp_posts.ID ASC

INNER JOIN语法将仅返回在两个表中匹配的行。因此,如果您没有匹配的行,您将不会得到任何结果。通过将其更改为 a LEFT JOIN,即使wp_postmeta表中没有匹配的行,您也将返回所有行。如果该行不存在,则wp_postmeta表中的值将为null.

于 2013-02-27T16:08:54.737 回答
0

以下返回

  • 来自 WP_Posts 的所有记录
  • 只有那些带有 WP_TERM_RELATIONSHIPS 的记录
  • 只有 wp_postmeta 中与 wp_posts 匹配的那些记录。

*

SELECT wp_posts.ID, wp_posts.post_name, wp_posts.post_title, 
  wp_posts.post_status, wp_postmeta.meta_value
FROM wp_posts
LEFT JOIN wp_term_relationships 
  ON wp_posts.ID = wp_term_relationships.object_id
LEFT JOIN wp_postmeta 
  ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_term_relationships.term_taxonomy_id IN ( 1, 2, 3 )
  AND wp_posts.post_type =  'my_post_type'
  AND wp_posts.post_statusIN ('my_status_1',  'my_status_2') 
  AND (wp_postmeta.meta_key =  'my_meta_key' or wp_postmeta.meta_key is null)
GROUP BY wp_posts.ID
ORDER BY wp_posts.ID ASC

您需要 is null 否则将排除 wp_posts 中没有 wp_postmeta 数据的记录。

于 2013-02-27T16:14:38.250 回答