programing

워드프레스 포스트 메타에 행을 열로 선택

codeshow 2023. 9. 19. 21:31
반응형

워드프레스 포스트 메타에 행을 열로 선택

워드프레스wp_postmeta테이블에는 게시물에 대한 모든 추가 필드가 있지만 행으로 구성되어 있으므로 추가하기 쉽습니다.

그러나 이제 모든 게시물의 모든 필드에 대해 쿼리하고 싶습니다. 저는 분명히 그 필드들을 행이 아닌 열로 원합니다.

이것이 내가 실행하고 있는 쿼리입니다.

SELECT p.post_title, 
       m.meta_value, 
       m.meta_key 
FROM   wp_posts p 
       JOIN wp_postmeta m 
         ON p.id = m.post_id 
WHERE  p.id = 72697; 

이렇게 하면 모든 meta_value와 각각의 meta key가 열로 제공됩니다.하지만 저는 메타 키 값을 열로 하고 메타 값을 행으로 해야 합니다.

예를들어 a.meta_key그럴 수도 있겠지요additional_description그리고 그것의 가치는What's up

그래서 나는 이런게 필요합니다.

SELECT p.post_title, additional_description
FROM   wp_posts p 
       JOIN wp_postmeta m 
         ON p.id = m.post_id 
WHERE  p.id = 72697; 

칼럼으로 필요합니다.저는 또한 모든 게시물이 필요하고 특정 게시물이 필요하지 않지만, 삭제할 수 있습니다.where질문을 하지 않을 뿐입니다(게시물이 많아서 문제가 될 수 있습니다).

여기 몇 가지 샘플 데이터와 wp_postmeta table을 표시하는 방법이 있습니다.

meta_key    post_id     meta_key    meta_value
1       5       total_related   5
2       5       updated     0
3       5       cricket     1
4       8       total_related   8
5       8       updated     1
6       8       cricket     0



wp_post table

id  post_title      other things I dont care about
5   This is awesome
8   This is more awesome

wp_post ID는 wp_postmeta 테이블의 post_id와 관련이 있습니다.

결과수배

post_title      total_related   updated     cricket
This is awesome     5       0       1
This is more awesome    8       1       0   

이런 건 어때요?

SELECT p.post_title, m1.meta_value as 'total_related', m2.meta_value as 'updated', m3.meta_value as 'cricket'
FROM wp_posts p
LEFT JOIN wp_postmeta m1
    ON p.id = m1.post_id AND m1.meta_key = 'total_related'
LEFT JOIN wp_postmeta m2
    ON p.id = m2.post_id AND m2.meta_key = 'updated'
LEFT JOIN wp_postmeta m3
    ON p.id = m3.post_id AND m3.meta_key = 'cricket'

그리고 당신이 특정한 게시물을 찾고 있는 것이 아니기 때문에 당신은 이것을 할 수 있을 것입니다.

특정 정보를 조회하려면post_types당신은 이와 같은 것을 시도할 수 있습니다.

SELECT p.post_title, m1.meta_value as 'total_related', m2.meta_value as 'updated', m3.meta_value as 'cricket'
FROM wp_posts p
LEFT JOIN wp_postmeta m1
    ON p.id = m1.post_id AND m1.meta_key = 'total_related'
LEFT JOIN wp_postmeta m2
    ON p.id = m2.post_id AND m2.meta_key = 'updated'
LEFT JOIN wp_postmeta m3
    ON p.id = m3.post_id AND m3.meta_key = 'cricket'
WHERE p.post_type = 'my_custom_post_type';

시도해 보십시오.

select post_title , 
 MAX(CASE WHEN `meta_key`='total_related' THEN meta_value END)as 'total_related',
 MAX(CASE WHEN `meta_key` = 'updated' THEN meta_value END) as 'updated' ,
 MAX(CASE WHEN `meta_key` = 'cricket' THEN meta_value END) as 'cricket' 
FROM   wp_posts p 
JOIN wp_postmeta m ON p.id = m.post_id 
GROUP BY p.id

몇 가지 접근법이 있습니다.

다음은 SELECT 목록에서 상관된 하위 쿼리를 사용하여 지정된 결과를 가져오는 한 가지 방법의 예입니다.

SELECT p.post_title
     , ( SELECT m1.meta_value
           FROM wp_post_metadata m1
          WHERE m1.meta_key = 'total_related'
            AND m1.post_id = p.id
          ORDER BY m1.meta_key LIMIT 1
       ) AS `total_related`
     , ( SELECT m2.meta_value
           FROM wp_post_metadata m2
          WHERE m2.meta_key = 'updated'
            AND m2.post_id = p.id
          ORDER BY m2.meta_key LIMIT 1
       ) AS `updated`
     , ( SELECT m3.meta_value
           FROM wp_post_metadata m3
          WHERE m3.meta_key = 'cricket'
            AND m3.post_id = p.id
          ORDER BY m3.meta_key LIMIT 1
       ) AS `cricket`
  FROM wp_posts p
 WHERE p.id IN (5,8)

각각의 장점과 단점을 가지고 있는 몇 가지 다른 접근법이 있습니다.

제가 질문에 대한 댓글에서 언급한 다소 관련된 질문이 있습니다.이 질문은 몇 가지 접근법을 설명하지만 상관 관계가 있는 하위 쿼리 접근법은 생략합니다.)

동적으로 수행한 방법은 다음과 같습니다. 이 절차에서는 특정 포스트 유형에 대한 모든 포스트 메타 키에 대한 SQL 문을 구축한 다음 "pivot" 쿼리를 실행합니다.

이는 가장 빠른 쿼리가 아니며, 마이그레이션 및 데이터에 대한 심층적인 정보를 제공하는 데만 사용됩니다. 하지만 이는 효과가 있습니다.

이렇게 하면 일시적으로 concat 함수의 최대 길이가 재설정되므로 큰 SQL 문을 만들 수 있습니다.

CREATE PROCEDURE `wp_posts_pivot`(IN post_type_filter varchar(50))
BEGIN

/* allow longer concat */
declare max_len_original INT default 0;
set max_len_original = @@group_concat_max_len;
set @@group_concat_max_len=100000;

SET @sql = NULL;
SELECT 
    GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(pm.meta_key = ''',
                meta_key,
                ''', pm.meta_value, NULL)) AS `',
                meta_key,
                '`'))
INTO @sql FROM
    wp_posts p
        INNER JOIN
    wp_postmeta AS pm ON p.id = pm.post_id
WHERE
    p.post_type = post_type_filter;

SET @sql = CONCAT('SELECT p.id
                    , p.post_title
                    , ', @sql, ' 
                   FROM wp_posts p
                   LEFT JOIN wp_postmeta AS pm 
                    ON p.id = pm.post_id
                    where p.post_type=\'',post_type_filter,'\'
                   GROUP BY p.id, p.post_title');

/* reset the default concat */
set @@group_concat_max_len= max_len_original;

/*
select @sql;
*/

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


END

그런 다음 이 호출과 같은 간단한 호출을 통해 모든 메타 값과 함께 각 '페이지' 게시 유형에 대해 하나의 행을 선택할 수 있습니다.

call wp_posts_pivot('page');

언급URL : https://stackoverflow.com/questions/24516710/select-rows-as-columns-for-wordpress-post-meta

반응형