2013-02-27 75 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記錄將被排除在外。