2013-07-03 1 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'을 옵션으로 지정해야합니다. 그렇다면 거기에 없으면 다른 비교를 수행하고 필요한 데이터를 얻을 수 있습니다.

(어떻게 든이는 OUTER와 함께 할 것 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

합니다. 테이블 구조를 더 잘 알지 못하면 어떻게 효과적으로이 작업을 수행하는지 정확히 알기가 어렵습니다 (이러한 조인을 조합 할 수있는 것 같음). 여기

그냥 원래 쿼리 편집 자상이다 : 그것은 단지 좌 meta_key이 누락 될 수 있습니다 게시물을 반환하려고 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 

을 다음 WHERE 절은 계정에 시도 수정 for 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 

는 (A 조금 놀라운, 나는 가정을 많이 만들어 ... 을 이해하기 위해 (참고 :. 당신이 wp_postmeta 테이블 (meta_key, meta_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 

합 (IF()) 이전 쿼리에서 재미의 종류 하지만 아마도 그것이 될 수있는만큼 performant 아니라 nce는 테이블의 모든 행을 평가합니다. 위의 쿼리는 post_id를 먼저 내린 다음 해당 post_id를 기반으로 해당 데이터를 가져옵니다.

+0

안녕하세요 앤드류,이 훌륭한 반응에 감사드립니다. 나는 지금 당신의 질문을 가지고 놀고 있습니다 ... 제 2의 것은 제 1의 것보다 더 잘 작동하고있는 것 같습니다, 기묘하게. 당신이 거기에가는 영리한 것들! – Eric

+1

하하, 그래, 그 중 하나는 재미있게 쓰는 사람이었다. 아마도 좀 더 효율적 일 수 있습니다. 네가 아직도해야 할 일을 하는게 아니야? –

+0

완벽하게 작동하는 것 같습니다. 정말 도움을 주셔서 감사합니다! 이제 저는이 성명서를 정말로 분해하고 여러분이 여기서 한 모든 것을 정말로 이해할 수 있도록 몇 분간 기다려야합니다.나는 'sum'트릭을 좋아한다. – Eric