2012-11-05 3 views
0

아래 표에서 logo_IDshow_logo 키는 post_id 필드를 기반으로 서로 연결되어 있습니다. show_logo1 인 행에 대해 logo_ID의 값을 얻으려면 만 mysql을 사용합니까? 이 익숙해 보인다면 이것은 WP postmeta 테이블에서하기 때문에별도의 행에있는 다른 필드의 값을 기준으로 행을 표시하려면 어떻게합니까?

post_id meta_key  meta_value 
------- ----------- ---------- 
262  logo_ID  263  
262  show_logo 0   
260  logo_ID  261  
260  show_logo 1   
258  logo_ID  259  
258  show_logo 1   

그것입니다. 나는 $wpdb을 사용하여 db를 쿼리하므로 모든 것이 mysql에 있어야한다 (WP 함수는 어디에도 없다).

+0

SQL 또는 Wordpress 기능을 사용하고 있습니까? – doublesharp

+0

죄송합니다, 이것은 순수한 MySQL입니다. – enchance

답변

2

당신은 당신이 WHERE 절에 원하는 값을 지정 자체에 wp_postmeta 테이블을 가입 할 수 있습니다. 당신은 많은 양의 데이터를 처리하는 경우가 wp_postmeta 테이블에 인덱스를 사용하므로

SELECT pm2.post_id, pm2.meta_key 
FROM wp_postmeta pm1 
JOIN wp_postmeta pm2 
    ON pm2.post_id = pm1.post_id AND pm2.meta_key = 'logo_ID' 
WHERE pm1.meta_key = 'show_logo' AND pm1.meta_value = 1 

이 상당히 빠릅니다. 다른 값을 기준으로 사용하려면 JOINwp_postmeta 이상을 입력하고 다른 입력란을 가져 오려면 wp_posts 테이블을 사용할 수도 있습니다.

SQL Fiddle

1

meta_key 값을 기준으로 CASE 문을 사용하여 행을 피벗하므로 post_id 값을 연속적으로 표시 한 다음 하위 쿼리로 줄 바꿈하십시오.

  • SELECT * 
    FROM 
    (
        SELECT post_id, 
          MAX(CASE WHEN meta_key = 'logo_ID' THEN meta_value ELSE NULL END) logo_ID, 
          MAX(CASE WHEN meta_key = 'show_logo' THEN meta_value ELSE NULL END) show_logo 
        FROM tableName 
        GROUP BY post_ID 
    ) a 
    WHERE show_logo = 1 
    
    SQLFiddle Demo
+0

인덱스를 활용하기 위해 테이블 ​​자체에 조인하는 것이 더 좋지 않습니까? – doublesharp

관련 문제