2013-07-03 106 views
1

我試圖讓所有職位wp_postmeta表有(meta_key='propdetails' AND meta_value LIKE '%Vacant Unrented Ready%')(meta_key='featured' AND meta_value='on')SQL的Wordpress查詢 - 內部與外部聯接

我現有的查詢(下面)正在工作,除了當meta_key的「精選」行是缺少。然後,該帖子不返回。

同樣,對於匹配行,我也需要檢索我想獲得的meta_value其中meta_key='martygeocoderlatlng'。但是,如果該meta_key丟失,那麼整個帖子根本不會被返回。

所以我需要把我現有的查詢,使meta_key='featured'meta_key='martygeocoderlatlng'可選,所以如果他們不在那裏,我仍然可以做我的其他比較,並獲得我需要的數據。

(我認爲這將與外部進行JOIN不知怎麼的,但我確實不能理清語法)。

這裏是我現有的查詢,僅返回其中meta_key =「特色」和meta_key行=「martygeocoderlatlng」在wp_postmeta表(和WHERE子句中的其他條件都滿足,當然)存在:

SELECT 
    p.*, 
    pm.*, 
    pm_featured.meta_value AS featured, 
    pm_latlng.meta_value AS latlng 

FROM 
    wp_posts p 
    JOIN wp_postmeta pm 
     ON pm.post_id = p.ID 
    JOIN wp_postmeta pm_propdetails 
     ON (pm_propdetails.post_id = p.ID AND pm_propdetails.meta_key = 'propdetails') 
    JOIN wp_postmeta pm_featured 
     ON (pm_featured.post_id = p.ID AND pm_featured.meta_key = 'featured-property') 
    JOIN wp_postmeta pm_latlng 
     ON (pm_latlng.post_id = p.ID AND pm_latlng.meta_key = 'martygeocoderlatlng') 

    JOIN wp_term_relationships tr 
     ON tr.object_id = p.ID 
    JOIN wp_term_relationships tr_taxrel 
     ON (tr_taxrel.object_id = p.ID AND tr_taxrel.term_taxonomy_id = 12) 

WHERE 
    (pm_propdetails.meta_value LIKE '%Vacant Unrented Ready%' 
     OR 
    pm_featured.meta_value = 'on') 

    AND p.post_type = 'property' 
    AND p.post_status = 'publish' 

GROUP BY p.ID 
ORDER BY p.post_date DESC 

回答

1

這是一個非常強烈的查詢。很難確切地知道如何更好地瞭解如何更好地瞭解您的表結構(看起來像一些JOIN可以組合)。

這裏是一個刺僅僅通過編輯原始查詢:

SELECT 
    p.*, 
    pm.*, 
    pm_featured.meta_value AS featured, 
    pm_latlng.meta_value AS latlng 

FROM 
    wp_posts p 
    JOIN wp_postmeta pm 
     ON pm.post_id = p.ID 
    JOIN wp_postmeta pm_propdetails 
     ON (pm_propdetails.post_id = p.ID AND pm_propdetails.meta_key = 'propdetails') 
    LEFT JOIN wp_postmeta pm_featured 
     ON (pm_featured.post_id = p.ID AND pm_featured.meta_key = 'featured-property') 
    LEFT JOIN wp_postmeta pm_latlng 
     ON (pm_latlng.post_id = p.ID AND pm_latlng.meta_key = 'martygeocoderlatlng') 

    JOIN wp_term_relationships tr 
     ON tr.object_id = p.ID 
    JOIN wp_term_relationships tr_taxrel 
     ON (tr_taxrel.object_id = p.ID AND tr_taxrel.term_taxonomy_id = 12) 

WHERE 
    (pm_propdetails.meta_value LIKE '%Vacant Unrented Ready%' 
     OR 
    (pm_featured.meta_value = 'on' OR pm_feature.meta_value IS NULL)) 

    AND p.post_type = 'property' 
    AND p.post_status = 'publish' 

GROUP BY p.ID 
ORDER BY p.post_date DESC 

它只是使用LEFT JOIN的嘗試返回那裏meta_key可能丟失的職位,然後在WHERE部分作了修改,試圖賬戶如果pm_featured.meta_value是NULL。

如果您提供更多信息,可以嘗試其他版本。

編輯: 根據你的問題,這也可能工作。真的只是在黑暗中雖然=巨大的鏡頭)

SELECT T2.*, T1.featured, T1.latlng FROM 
(
    SELECT post_id, SUM(IF((meta_key='propdetails' AND meta_value LIKE '%Vacant Unrented Ready%') OR ((meta_key='featured' AND meta_value='on')),1,0)) AS Keeper 
    , MAX(IF(meta_key = 'featured-property',meta_value,NULL)) AS featured 
    , MAX(IF(meta_key = 'martygeocoderlatlng',meta_value,NULL)) AS latlng 
    FROM wp_postmeta 
    GROUP BY post_id 
    HAVING Keeper>0 
) AS T1 
JOIN 
wp_posts AS T2 
ON T1.post_id=T2.ID 
AND T2.post_type = 'property' 
AND T2.post_status = 'publish' 
JOIN 
wp_term_relationships AS T3 
ON T2.ID=T3.object_id AND T3.term_taxonomy_id = 12 
GROUP BY T2.ID 
ORDER BY T2.post_date DESC 

由於第二查詢結束了工作(有點令人驚訝,我做了很多假設的)這一個應該稍快,更容易一點點了解... (注:尤其是如果你在wp_postmeta表上(meta_keymeta_value)複合指數)

SELECT T2.*, T1.featured, T1.latlng FROM 
(
    SELECT postmetas_info.post_id 
    , MAX(IF(meta_key = 'featured-property',meta_value,NULL)) AS featured 
    , MAX(IF(meta_key = 'martygeocoderlatlng',meta_value,NULL)) AS latlng 
    FROM 
    (
     SELECT DISTINCT post_id FROM wp_postmeta WHERE (meta_key='propdetails' AND meta_value LIKE '%Vacant Unrented Ready%') OR (meta_key='featured' AND meta_value='on') 
    ) AS postmetas_applicable 
    JOIN 
    wp_postmeta AS postmetas_info 
    ON postmetas_applicable.post_id=postmetas_info.post_id 
    GROUP BY postmetas_info.post_id 
) AS T1 
JOIN 
wp_posts AS T2 
ON T1.post_id=T2.ID 
AND T2.post_type = 'property' 
AND T2.post_status = 'publish' 
JOIN 
wp_term_relationships AS T3 
ON T2.ID=T3.object_id AND T3.term_taxonomy_id = 12 
GROUP BY T2.ID 
ORDER BY T2.post_date DESC 

的SUM(IF())在前面的查詢是一種樂趣但可能不像性能可能會高它會評估表中的每一行。上面的查詢減少了post_id的優先級,然後僅根據符合條件的post_id獲取相應的數據。

+0

嘿安德魯,謝謝你的迴應。我現在在玩你的提問......第二個人似乎比第一個人好,奇怪。一些聰明的東西,你去那裏! – Eric

+1

哈哈,是的,這是一個有趣的寫作。雖然可能會更有效一些。任何它沒有做的事情,你仍然需要它做? –

+0

它似乎是完美的工作。非常感謝您的幫助!現在我只需要擱置幾分鐘來真正分解這個聲明,並真正理解你在這裏所做的一切。我喜歡'總和'技巧。 – Eric