0

我正在开发一个应用程序,我基本上将部分 wordpress 数据库同步到应用程序。我希望不是创建 wordpress 的整个表结构,而是创建一个 CategoryRelationship 表,其中仅包含 2 列 (POST_ID) 和 (CATEGORIES_ID)。类别 ID 是帖子所属的所有类别(包括父类别)的逗号分隔值。请注意,我的 wordpress 数据库是多站点的一部分,因此是 WP_2_ 前缀。

尝试 1)如下,它几乎可以工作并给我最接近我想要的结果,但似乎没有得到第一个父级(请注意,我只有最大层次结构为 3 个父级的类别:

SELECT DISTINCT ID, 
(SELECT CONCAT_WS(',',group_concat(tt.term_id separator ','),tt.parent,tt2.term_id, tt3.term_id, tt4.term_id) 
FROM wp_2_terms 
JOIN wp_2_term_taxonomy tt on wp_2_terms.term_id = tt.term_id 
JOIN wp_2_term_relationships wpr on wpr.term_taxonomy_id = tt.term_taxonomy_id 
LEFT JOIN wp_2_term_taxonomy tt2 on tt.parent = tt2.term_id 
LEFT JOIN wp_2_term_taxonomy tt3 on tt2.parent = tt3.term_id 
LEFT JOIN wp_2_term_taxonomy tt4 on tt3.parent = tt4.term_id 
WHERE tt.taxonomy != 'category' and wp_2_posts.ID = wpr.object_id 
) AS 'Categories' 
FROM wp_2_posts 
WHERE post_type = 'post' 
AND post_status = 'publish'
AND post_author = 2

这给了我这样的结果:

ID  Categories
10  21,101,166,183,311,350,356,357,360,363,0
19  69,123,166,352,354,356,132,358,360,362,68,68

上面的例子大部分都有效,虽然我错过了第一个父母,但我知道这个查询可以给我重复,但我稍后会清理它(如果我可以一次性完成这一切,那显然是最好的)。
另外,如果我换行:

LEFT JOIN wp_2_term_taxonomy tt2 on tt.parent = tt2.term_id

JOIN wp_2_term_taxonomy tt2 on tt.parent = tt2.term_id

给我这样的结果:

ID  Categories
10  101,93,93
19  69,123,68,68

请注意,我现在获得了 ID 10 的类别 93(我在第一个中缺少它),但不是其余的。我尝试了所有不同的连接,但无济于事......

尝试 2)我从这里修改了这段代码,这让我得到了类别和父类别,但我必须指定 ID。我不确定如何在上面插入我的代码以循环获取所有带有类别的帖子 ID。目前它只是让我获得所有父类别和 term_id = 165 的类别。

SELECT group_concat(T2.term_id separator ',') AS 'Cats'
FROM (
    SELECT
        @r AS _id,
        (SELECT @r := parent FROM wp_2_term_taxonomy WHERE term_id = _id) AS parent,
        @l := @l + 1 AS lvl
    FROM
        (SELECT @r := 165, @l := 0) vars,
        wp_2_term_taxonomy tt
    WHERE @r <> 0) T1
JOIN wp_2_term_taxonomy T2
ON T1._id = T2.term_id
ORDER BY T1.lvl DESC;

这给了我这样的结果:

Cats
165,142

尝试3)这个查询仍然很基本,让我在一个单独的列中获得所有类别和第一个父类,但我需要以某种方式遍历父类......有什么想法吗?我希望尝试 2 和 3 之间的混合能够奏效,但我已经为此工作太久了。

SELECT DISTINCT ID, TT.term_id, TT.parent
FROM wp_2_posts p
JOIN wp_2_term_relationships TR
ON TR.object_id = p.ID
JOIN wp_2_term_taxonomy TT
ON TR.term_taxonomy_id = TT.term_taxonomy_id
WHERE p.post_type = 'post'
AND p.post_status = 'publish'
AND p.post_author = 2

这给了我一个看起来像的表格:

ID  term_id parent
10  1   0
10  21  0
10  101 93
10  166 0
10  183 0
10  311 0
10  350 0
10  356 0
10  357 0
10  360 0
10  363 0
19  1   0
19  69  68
19  123 122
19  166 0
19  352 0
19  354 0
19  356 0
19  132 0
19  358 0
19  360 0
19  362 0

提前感谢您的帮助。

4

1 回答 1

1

所以下面的查询对我有用,虽然我不觉得它是最好的解决方案。我必须添加比较,每个连接的分类都是相同的。由于某种原因,当它在 wp_2_term_taxonomy 表上进行第三次连接时,它正在连接无效值......无法解释。希望有人有更好的解决方案。

SELECT DISTINCT ID, (
SELECT CONCAT_WS( ',', GROUP_CONCAT( t.term_id
SEPARATOR ',' ) , GROUP_CONCAT( DISTINCT tt2.term_id
SEPARATOR ',' ) , GROUP_CONCAT( DISTINCT tt3.term_id
SEPARATOR ',' ) , GROUP_CONCAT( DISTINCT tt4.term_id
SEPARATOR ',' ) ) 
FROM wp_2_terms t
JOIN wp_2_term_taxonomy tt ON t.term_id = tt.term_id
JOIN wp_2_term_relationships wpr ON wpr.term_taxonomy_id = tt.term_taxonomy_id
LEFT JOIN wp_2_term_taxonomy tt2 ON tt.parent = tt2.term_id
AND tt2.taxonomy = tt.taxonomy
LEFT JOIN wp_2_term_taxonomy tt3 ON tt2.parent = tt3.term_id
AND tt2.taxonomy = tt3.taxonomy
LEFT JOIN wp_2_term_taxonomy tt4 ON tt3.parent = tt4.term_id
AND tt3.taxonomy = tt4.taxonomy
WHERE tt.taxonomy != 'category'
AND wp_2_posts.ID = wpr.object_id
) AS 'Categories'
FROM wp_2_posts
WHERE post_type = 'post'
AND post_status = 'publish'
AND post_author =2
于 2013-11-03T03:23:26.393 回答