Wordpress SQL-카테고리 및 태그 게시
이 쿼리를 사용하여 그의 카테고리와 태그가있는 게시물을 수신했습니다.
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는 없습니다. 누군가 나를 도울 수 있습니까?
답변
문제에 대한 좋은 해결책에 매우 가깝습니다.
다른 답변자가 다음과 같이 언급했습니다 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
모든 조인은 내부 조인이므로 데이터가 테이블 중 하나에서 일치하지 않으면 해당 데이터를 가져 오지 않습니다.
내부 조인을 왼쪽 / 오른쪽 외부 조인으로 변경합니다.