Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Wordpress SQL-帖子类别和标签_Mysql_Sql_Wordpress_Left Join_Inner Join - Fatal编程技术网

Mysql Wordpress SQL-帖子类别和标签

Mysql Wordpress SQL-帖子类别和标签,mysql,sql,wordpress,left-join,inner-join,Mysql,Sql,Wordpress,Left Join,Inner Join,我使用这个查询来接收带有他的类别和标签的帖子 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`

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

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
它是从

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

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


将内部联接更改为左/右外部联接。

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


将内部联接更改为左/右外部联接。

您非常接近于问题的良好解决方案

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

您的代码也显示出滥用的迹象。如果你说

   SELECT id, name, value
     FROM tbl
    GROUP BY id, name
你是说

  SELECT id, name, ANY_VALUE(value)
    FROM tbl
   GROUP BY id, name
换句话说,服务器从组中选择它想要的任何
值。您应该使用可预测的聚合结果,如
MAX(value)
GROUP\u CONCAT(value)
。MySQL版本8和其他SQL table server的品牌和型号拒绝使用您使用的语法

Pro-tip为了您的理智起见,不要在表名或列名周围使用反勾号,除非它们是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

你很快就能找到解决问题的好办法了

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

您的代码也显示出滥用的迹象。如果你说

   SELECT id, name, value
     FROM tbl
    GROUP BY id, name
你是说

  SELECT id, name, ANY_VALUE(value)
    FROM tbl
   GROUP BY id, name
换句话说,服务器从组中选择它想要的任何
值。您应该使用可预测的聚合结果,如
MAX(value)
GROUP\u CONCAT(value)
。MySQL版本8和其他SQL table server的品牌和型号拒绝使用您使用的语法

Pro-tip为了您的理智起见,不要在表名或列名周围使用反勾号,除非它们是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
只有在连接表时才需要使用
ANY_VALUE(VALUE)
,我做对了吗?我不会在我编写的代码中使用任何_VALUE(),因为我真的不喜欢不可预知的结果。我的建议是:通过对结果进行正确分组来避免使用它。只有在连接表时才需要使用
ANY_VALUE(VALUE)
,我做对了吗?我不会在我编写的代码中使用任何_VALUE(),因为我真的不喜欢不可预知的结果。我的建议是:通过对结果进行正确分组来避免使用它。