2017-04-21 148 views
2

我對在WordPress至極的帖子過濾工作從postsmeta使用數據: 我的日期過濾器工作,使我這個查詢:Wordpress查詢添加INNER/LEFT JOIN。爲什麼或如何去除/防止INNER/LEFT JOIN?

工作查詢結果:

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 

When I filter by postmeta.meta_value I get an extra INNER JOIN which is causing issues:

Filter (not exactly working)

$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)我確實得到了預期的結果。

EDIT: MySQL returns error: Not unique value table/alias: 'wp_postmeta'

我的問題是:

  • 爲什麼我的代碼又增加了INNER JOIN?
  • 如何移除/防止這種額外的INNER JOIN或LEFT JOIN?

任何幫助,將不勝感激。

+0

您正在過濾(即刪除不匹配的記錄),所以LEFT OUTER JOIN沒有任何意義。 – Kickstart

+0

我已經更新了我的帖子/問題,因爲我可以刪除左邊或內部連接,在這兩種情況下,它都會給出結果。 但我仍然不知道如何從SQL語句中刪除其中的一個連接。 –

+0

「wp_postmeta」表中沒有數據,但「wp_posts」中有相同的數據。 也許你需要思考爲什麼你沒有這個post_id的「wp_postmeta」中的數據? –

回答

0

感謝大家的投入,但事實證明,有什麼錯我的編碼,顯然有一些其他的插件至極sended GET參數時,我sended過濾參數,這是返回FALSE當此參數已設置,我通過在該插件中添加!EMPTY來修復它,之後它像魅力一樣工作。

0

由於您正在篩選where子句中wp_postmeta表中的值,因此LEFT JOIN將像INNER JOIN那樣工作,因爲它只會返回wp_postmeta表中具有匹配條件的值。所以擁有LEFT JOININNER 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 
+0

感謝您解決這個問題,但我無法/不知道如何修改查詢以從語句中刪除JOIN。 我不知道如何把它放在WHERE子句中,請問我能寫一個與$ query對象一起工作的代碼嗎?參考:篩選器(不完全正常) –

+0

我的意思是如何從WHERE子句中刪除它,並將其放入JOIN –