问题描述
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: get post category and tags
但是我有一个问题,查询会忽略没有标签的帖子。 我尝试了许多其他查询,但没有SUCSSES。 有人可以帮我吗?
解决方法
您所有的联接都是内部联接,因此,如果任何一个表中的数据都不匹配,则将不会提取该数据。
将内部联接更改为左/右外部联接。
,您已经非常接近解决问题的好方法了。
另一个回答者提到了这一点:使用LEFT JOIN
。为什么?普通内部JOIN
禁止显示第一个表中的行与第二个表中的行不匹配。
您的代码还显示出滥用MySQL's notorious extension to GROUP BY的迹象。如果你说
SELECT id,name,value
FROM tbl
GROUP BY id,name
您实际上是在说
SELECT id,ANY_VALUE(value)
FROM tbl
GROUP BY id,name
换句话说,服务器从组中选择所需的任何value
。您应该使用可预测的汇总结果,例如MAX(value)
或GROUP_CONCAT(value)
。 MySQL的版本8和其他类型和型号的SQL表服务器拒绝使用您使用的语法。
专业提示,为了您的头脑清醒,请勿在表名或列名周围使用反引号,除非它们在SQL中是保留字。而且,提示,请勿在表名或列名中使用保留字。
改为使用此查询。
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