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(),因为我真的不喜欢不可预知的结果。我的建议是:通过对结果进行正确分组来避免使用它。