2011-10-26 18 views
1

我有一些困難與我的SQL語句。我正在對WordPress進行查詢,以基於多個後期元字段顯示帖子。當我只用一個元字段進行查詢和篩選時,或者在多個元素上運行OR,但多個AND都失敗。SQL WordPress自定義查詢內部加入

SELECT wposts . * 
FROM wp_posts wposts 
INNER JOIN (
    SELECT post_id 
    FROM wp_postmeta wpostmeta 
    WHERE (
    (wpostmeta.meta_key = 'ulnooweg_business_industry' 
     AND wpostmeta.meta_value = 'Legal Services') 
    AND (
    wpostmeta.meta_key = 'ulnooweg_business_province' 
     AND wpostmeta.meta_value = 'New Brunswick') 
) 
    GROUP BY post_id 
) 
AS t ON t.post_id = wposts.ID 
WHERE wposts.post_status = 'publish' 
AND wposts.post_type = 'business' 
ORDER BY wposts.post_title ASC 
LIMIT 0 , 30 
+0

OR和AND邏輯上是不同的。你期望什麼結果? – Randy

+0

是的,我知道這一點。我想和,我想過濾這兩個元值。我可以確認數據是否存在,但是我的聲明沒有返回。 – Jeff

+0

你的問題是什麼?你的查詢應該是什麼樣的?發佈你的嘗試,即使它不起作用。 –

回答

2

您所查詢的是測試如果meta_key(和meta_value)是同一行有兩個不同的值,這是不可能的。但是,我看到你正在嘗試做的..

嘗試加入wp_postmeta表兩次,除了每個排除除了那些滿足meta_key條件的所有行ON子句:

SELECT 
    p.*, 
    GROUP_CONCAT(CONCAT(pm.meta_key,':',pm.meta_value) SEPARATOR ',') AS meta_values 
FROM 
    wp_posts p 
    JOIN wp_postmeta pm ON pm.post_id = p.ID 
    JOIN wp_postmeta pm_bi ON (pm_bi.post_id = p.ID AND pm_bi.meta_key = 'ulnooweg_business_industry') 
    JOIN wp_postmeta pm_bp ON (pm_bp.post_id = p.ID AND pm_bp.meta_key = 'ulnooweg_business_province') 
WHERE 
    pm_bi.meta_value = 'Legal Services' 
    AND pm_bp.meta_value = 'New Brunswick' 
    AND p.post_type = 'business' 
    AND p.post_status = 'publish' 
GROUP BY p.ID 
ORDER BY p.post_title ASC 

注:我加入在這裏wp_postmeta表3次有助於證明條件滿足,但是您可以刪除GROUP_CONCAT行(以及當前上一行的逗號)和第一個JOIN到wp_postmeta,並且查詢的工作原理相同。

0

在子查詢中,它看起來像它看起來的其中兩個wpostmeta.meta_key = 'ulnooweg_business_industry'wpostmeta.meta_key = 'ulnooweg_business_province'記錄 - 換句話說,wpostmeta.meta_key需要等於兩個字符串同時滿足這個條件。此外,它正在尋找wpostmeta.meta_value = 'Legal Services'wpostmeta.meta_value = 'New Brunswick'

我的猜測是,這是你的子查詢WHERE子句中想要什麼 - 改變AND S的一個至一個OR

.... 
WHERE (
    (wpostmeta.meta_key = 'ulnooweg_business_industry' 
    AND wpostmeta.meta_value = 'Legal Services') 
    OR (-- changed to an OR 
    wpostmeta.meta_key = 'ulnooweg_business_province' 
    AND wpostmeta.meta_value = 'New Brunswick') 
) 
.... 
+0

+1漂亮。回答一個問題很難,自己發現問題更加困難。 –

+0

OP明確表示他已經發現它與OR一起工作,但他正在試圖弄清楚他如何獲得既包含「法律服務」的行業元關鍵字又包含「New Brunswick」的省meta_key 」。 – ghbarratt

+0

@ghbarratt - 實際上,目前還不清楚OP想要什麼。它聲明他對某事做了「或」事,而且它起作用......但是它是什麼?但是,由於我提到的原因,發佈的代碼顯然必須返回任何結果。 –

0

問題出在你的內部select的where子句中;我猜wpostmeta返回MULTIPLE行。以前的評論,一個字符串不能是兩個值是正確的。如果第一次沒有

第二屆辦法應該工作起初我以爲

WHERE 
    ((wpostmeta.meta_key = 'ulnooweg_business_industry' AND wpostmeta.meta_value = 'Legal Services') OR 
    (wpostmeta.meta_key = 'ulnooweg_business_province' AND wpostmeta.meta_value = 'New Brunswick')) 
Group by Post_ID 
HAVING count(post_ID) = 2 

這隻會工作,如果只有一個在wpostmeta對於每種類型的條目記錄。如果 postmeta.meta_key ='ulnooweg_business_industry'AND wpostmeta.meta_value ='Legal Services'可能發生兩次,那麼上述不起作用。

第二個方法

Select wposts.* 
FROM WP_Posts wposts 
INNER JOIN (
Select POST_ID from WP_POSTMeta where meta_key = 'ulnooweg_business_industry' AND wpostmeta.meta_value = 'Legal Services' 
INTERSECT 
SELECT POST_ID FROM WP_POST_META WHERE meta_key = 'ulnooweg_business_province' AND wpostmeta.meta_value = 'New Brunswick' 
) 
AS T on T.Post_ID = wposts.ID