Wordpress SQL-카테고리 및 태그 게시

Sep 02 2020

이 쿼리를 사용하여 그의 카테고리와 태그가있는 게시물을 수신했습니다.

SELECT
    p.id,
    p.post_name,
    c.name,
    GROUP_CONCAT(t.`name`)
FROM wp_posts p
JOIN wp_term_relationships cr
    on (p.`id`=cr.`object_id`)
JOIN wp_term_taxonomy ct
    on (ct.`term_taxonomy_id`=cr.`term_taxonomy_id`
    and ct.`taxonomy`='category')
JOIN wp_terms c on
    (ct.`term_id`=c.`term_id`)
JOIN wp_term_relationships tr
    on (p.`id`=tr.`object_id`)
JOIN wp_term_taxonomy tt
    on (tt.`term_taxonomy_id`=tr.`term_taxonomy_id`
    and tt.`taxonomy`='post_tag')
JOIN wp_terms t
    on (tt.`term_id`=t.`term_id`)
GROUP BY p.id

Wordpress SQL 에서 가져온 것입니다 : 게시물 카테고리 및 태그 가져 오기

하지만 문제가 있습니다 . 쿼리는 태그가없는 게시물을 무시합니다 . 다른 많은 쿼리를 시도했지만 SUCSSES는 없습니다. 누군가 나를 도울 수 있습니까?

답변

1 O.Jones Sep 02 2020 at 02:16

문제에 대한 좋은 해결책에 매우 가깝습니다.

다른 답변자가 다음과 같이 언급했습니다 LEFT JOIN.. 왜? 일반 내부 JOIN는 두 번째 테이블의 행과 일치하지 않는 첫 번째 테이블의 행을 억제합니다.

귀하의 코드는 또한 MySQL의 악명 높은 GROUP BY 확장을 오용하는 징후를 보여줍니다 . 당신이 말하는 경우

   SELECT id, name, value
     FROM tbl
    GROUP BY id, name

당신은 실제로 말하고 있습니다

  SELECT id, name, ANY_VALUE(value)
    FROM tbl
   GROUP BY id, name

즉, 서버는 value그룹 내에서 원하는 것을 선택 합니다. 당신은 같은 예측 집계 결과를 사용해야 MAX(value)하거나 GROUP_CONCAT(value). MySQL 버전 8과 SQL 테이블 서버의 다른 제조업체 및 모델은 사용하는 구문을 거부합니다.

당신의 온전함을 위해 프로 팁 은 SQL의 예약어가 아닌 한 테이블 또는 열 이름 주위에 백틱을 사용하지 마십시오. 그리고 Pro tip , 테이블 또는 열 이름에 예약어를 사용하지 마십시오.

대신이 쿼리를 사용하십시오.

SELECT
    p.id,
    p.post_name,
    GROUP_CONCAT(c.name ORDER BY c.name) categories,
    GROUP_CONCAT(t.name ORDER BY t.name) tags
FROM wp_posts p
LEFT JOIN wp_term_relationships cr
    on (p.id=cr.object_id)
LEFT JOIN wp_term_taxonomy ct
    on (ct.term_taxonomy_id=cr.term_taxonomy_id
    and ct.taxonomy='category')
LEFT JOIN wp_terms c on
    (ct.term_id=c.term_id)
LEFT JOIN wp_term_relationships tr
    on (p.id=tr.object_id)
LEFT JOIN wp_term_taxonomy tt
    on (tt.term_taxonomy_id=tr.term_taxonomy_id
    and tt.taxonomy='post_tag')
LEFT JOIN wp_terms t
    on (tt.term_id=t.term_id)
GROUP BY p.id, p.post_name
2 Atif Sep 02 2020 at 01:49

모든 조인은 내부 조인이므로 데이터가 테이블 중 하나에서 일치하지 않으면 해당 데이터를 가져 오지 않습니다.

내부 조인을 왼쪽 / 오른쪽 외부 조인으로 변경합니다.