【问题标题】:Wordpress SQL - post category and tagsWordpress SQL - 帖子类别和标签
【发布时间】:2020-09-01 18:45:47
【问题描述】:

我使用这个查询来接收带有他的类别和标签的帖子。

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

但我有一个问题,查询会忽略没有标签的帖子。 我尝试了许多其他查询,但没有成功。 有人可以帮我吗?

【问题讨论】:

    标签: mysql sql wordpress left-join inner-join


    【解决方案1】:

    您的所有联接都是内部联接,因此如果任何一个表中的数据都不匹配,则不会获取该数据。

    将您的内连接更改为左/右外连接。

    【讨论】:

      【解决方案2】:

      您已经非常接近解决问题的好方法了。

      另一个回答者提到了这一点:使用LEFT JOIN。为什么?普通内部 JOIN 抑制第一个表中与第二个表中的行不匹配的行。

      您的代码还显示出滥用MySQL's notorious extension to 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 中的保留字。而且,专业提示,不要在表名或列名中使用保留字。

      改用这个查询。

      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
      

      【讨论】:

      • 只有在加入表格时才需要使用ANY_VALUE(value),我做对了吗?
      • 我从不在我编写的代码中使用 ANY_VALUE(),因为我真的不喜欢不可预测的结果。我的建议:通过正确分组结果来避免对它的需要。
      猜你喜欢
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      相关资源
      最近更新 更多