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: 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...