2012-12-01 5 views
0

사용자 지정 게시물 유형 (속성)의 사용자 지정 메타 값이 저장할 때 다른 사용자 지정 게시 유형 (경고)의 메타 값과 일치하는지 확인하기 위해 쿼리를 작성하려고합니다.모든 준비가 여러 조인을 가지고있는 DB에 대해 쿼리간에 어떻게 수행합니까?

나는이 작업을 정상적으로 수행 할 수 있습니다. 필드 그러나 '범위'에 '속성'의 '침실'이 '경고'의 'a_bedrooms_min'과 'a_bedrooms_max'사이에 있으면 예를 들어 작동하도록하려고합니다. 내 쿼리 지금까지 다음과 같습니다

//Property Meta Fields 
$meta_type = 'flat'; 
$meta_bedrooms = '2'; 

//Alert Meta Fields 
a_bedrooms_min = 1 
a_bedrooms_max = 3 

SELECT ID 
    FROM wp_posts 
    INNER JOIN wp_postmeta m1 
     ON (wp_posts.ID = m1.post_id)  
    INNER JOIN wp_postmeta m2 
     ON (wp_posts.ID = m2.post_id) 
    INNER JOIN wp_postmeta m3 
     ON (wp_posts.ID = m3.post_id) 
WHERE 
    wp_posts.post_type = 'alerts' 
    AND wp_posts.post_status = 'publish' 
    AND (m1.meta_key = 'a_property_type' AND m1.meta_value = '$meta_type') 
    AND (m2.meta_key = 'a_bedrooms_min' AND m2.meta_value >= '$meta_bedrooms') 
    AND (m3.meta_key = 'a_bedrooms_max' AND m3.meta_value <= '$meta_bedrooms') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date 
DESC; 

마지막 두 AND 연산은 분명히 내가 뭘하려고 오전 작동하지 않습니다하지만 어떻게이 작업을 얻을 수있는 것?

감사 로버트

답변

1

나는 당신이 가까운 생각합니다. 하이브리드 오래된 ANSI 대 명시적인 JOIN이 있습니다. 이 예에서 볼 수 있듯이 3 가지 기준 중 하나가 명시 적으로 세 부분 모두에서 메타 테이블에 조인됩니다. 따라서 ID는 각 메타가 하나의 레코드를 반환해야하므로 ID 당 한 번만 표시되어야하며 3 개의 메타가 모두 해당 일치를 찾으면 레코드는 한정됩니다.

SELECT 
     ID 
    FROM 
     wp_posts 

     INNER JOIN wp_postmeta m1 
      ON wp_posts.ID = m1.post_id 
      AND m1.meta_key = 'a_property_type' 
      AND m1.meta_value = '$meta_type' 

     INNER JOIN wp_postmeta m2 
      on wp_posts.ID = m2.post_id 
      AND m2.meta_key = 'a_bedrooms_min' 
      AND m2.meta_value <= '$meta_bedrooms' 

     INNER JOIN wp_postmeta m3 
      on wp_posts.ID = m3.post_id 
      AND m3.meta_key = 'a_bedrooms_max' 
      AND m3.meta_value >= '$meta_bedrooms' 

    WHERE 
      wp_posts.post_type = 'alerts' 
     AND wp_posts.post_status = 'publish' 

    GROUP BY 
     wp_posts.ID 

    ORDER BY 
     wp_posts.post_date DESC; 

실제로 나는 < = 및> =이 (가) 거꾸로 있다고 생각하여 개정했습니다. 예를 들어, meta_value의 최소 침실 수는 1이고 최대 수는 3입니다. 귀하는 자격을 얻기 위해 2를 찾고 있습니다.

그래서, 당신은 < = 2와 2 < = 원래 발표되었다 무엇 MAX_BEDROOMS 이 MIN_BEDROOMS입니다> = 2 및 MAX_BEDROOMS < = 2 (1 결코 큰 2보다) (2는 결코 적은 2 이상) MIN_BEDROOMS 필요해 .

다시 시도하십시오.

+0

답장을 보내 주셔서 감사합니다. 나는이 접근법을 사용할 것이다. 그러나 이것은 여전히 ​​'$ meta_bedrooms'가 항상 같은 값을 포함하므로이 경우에는 작동하지 않습니다. 2. 위의 두 번째 조인 값은 1을 말하고 세 번째 조인 값은 말할 필요가 있습니다. 3. – Robert

+0

@ 로버트에 대한 수정 및 의견보기 <= and > = – DRapp

+0

결국 간단합니다. 당신의 도움에 감사드립니다. 훌륭한 작품. – Robert

관련 문제