2013-02-27 74 views
0

首先我想提一提MYSQL的联接,我的技能有限。然而,这是我拥有的和我想要实现的:内部联接缺失行

我有默认的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 

一切正常时,每个帖子都有“my_meta_key”的postmeta预期。但是,如果缺少'my_meta_key',则帖子不在结果中。

我想它是由第二个INNER JOIN造成的,但是如前所述,我不知道应该用什么来替代它。

我敢肯定,这是一个LEFT JOIN东西就wp_postmeta表简单

+0

考虑:使用LEFT连接而不是INNER JOIN。请参阅以下链接以获取连接类型的视觉解释:http://www.codinghorror。com/blog/2007/10/a-visual-explanation-of-sql-joins.html – xQbert 2013-02-27 16:08:36

回答

1

移动AND wp_postmeta.meta_key = 'my_meta_key'

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

筛选和改变内部的LEFT

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

如果你把你的病情在“Where子句”左派加盟将是“覆盖” 。 我会添加一个建议。当你不需要它来保持你的代码易于阅读时,不要使用括号。

+0

我知道它有些不同。谢谢!我不能除了它,但仍然导致你快速:) – Xaver 2013-02-27 16:12:33

+0

@revaxarts没问题! – JudgeProphet 2013-02-27 16:18:59

0

更改INNER JOIN

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

而对于wp_postmetaWHERE过滤器移动到JOIN条件。

所以您的查询将是:

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语法仅返回匹配两个表中的行。所以如果你没有匹配的行,你将不会得到任何结果。通过将其更改为LEFT JOIN,即使wp_postmeta表中没有匹配的行,也会返回所有行。如果该行不存在,则wp_postmeta表中的值将为null

0

下返回

  • 所有记录WP_Posts
  • 只有那些在wp_postmeta与WP_TERM_RELATIONSHIPS
  • 只有那些记录记录这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 

你需要的是空,否则在没有wp_postmeta数据wp_posts记录将被排除在外。