使用MySQL按分类手动查询帖子

时间:2015-11-10 作者:SomeNorwegianGuy

我正在尝试从WP数据库中查询具有该类别的帖子uncategorised, 虽然也加入了post meta表,但我无法让它工作。我得到一个空结果。

这是我的问题

SELECT * FROM wptests_posts wp
INNER JOIN wptests_postmeta wm ON (wm.`post_id` = wp.`ID`)
INNER JOIN wptests_term_relationships wtr ON (wp.`ID` = wtr.`object_id`)
INNER JOIN wptests_term_taxonomy wtt ON (wtr.`term_taxonomy_id` = wtt.`term_taxonomy_id`)
INNER JOIN wptests_terms wt ON (wt.`term_id` = wtt.`term_id`) AND
((wtt.`taxonomy` = \'category\' AND  wt.`slug` = \'uncategorized\'))
这似乎是第2行的Posteta内部连接。如果我删除它,我会得到预期的结果,除非我没有得到post meta。

非常感谢您的帮助

1 个回复
SO网友:Jake

这对我来说很好。postmeta包含的内容可能有点混乱。没有它,我得到了大约150个结果。有了它,我赚了5000多英镑。我从来没有空过结果。

由于Posteta每篇文章都有从零到数百个项目,因此它将为每个Posteta项目创建一个新行,并不断重复每行的帖子信息。

所以我补充道GROUP BY wp.ID, 这打破了它:

查询1错误:选择列表的表达式#24不在GROUP BY子句中,并且包含未聚合的列“local”。wm。meta\\u id\'在功能上不依赖于GROUP BY子句中的列;这与sql\\u mode=only\\u full\\u group\\u by不兼容

这主要是因为GROUP BY 列(wp.ID) 需要在SELECT子句中。无论如何,这也不会得到你的邮差。因此,如果没有分组方式,它就起作用了,您只需要在得到结果后进行处理,然后将它们合并。

没有一种很好的方法可以在一个查询中获取所有元。最好指定所需内容或使用多个查询。

下面是一个选项,但它可能会耗尽CONCAT() 条款。我有很多关于meta的帖子。它返回一列中的所有元键和一列中稍后可以在循环中分离出来的所有元值。

SELECT
    wp.ID,
    wp.*,
    GROUP_CONCAT(wm.meta_key ORDER BY wm.meta_key DESC SEPARATOR \'||\') as meta_keys,
    GROUP_CONCAT(wm.meta_value ORDER BY wm.meta_key DESC SEPARATOR \'||\') as meta_values
FROM
    wptests_posts wp
    INNER JOIN wptests_postmeta wm ON (wm.`post_id` = wp.`ID`) AND wm.meta_key NOT LIKE \'\\_%\'
    INNER JOIN wptests_term_relationships wtr ON (wp.`ID` = wtr.`object_id`)
    INNER JOIN wptests_term_taxonomy wtt ON (wtr.`term_taxonomy_id` = wtt.`term_taxonomy_id`) AND (wtt.`taxonomy` = \'category\')
    INNER JOIN wptests_terms wt ON (wt.`term_id` = wtt.`term_id`) AND  (wt.`slug` = \'uncategorised\')
    GROUP BY wp.ID
类似于:

function custom_separate_postmeta( $a ) {
    $output = array_merge( $a, array_combine( explode(\'||\', $a[\'meta_keys\']), array_map(\'maybe_unserialize\', explode(\'||\', $a[\'meta_values\'])) ) );
    unset($output[\'meta_keys\']);
    unset($output[\'meta_values\']);
    return $output;
}
您可以在结果上运行它:

$posts = array_map( \'custom_separate_postmeta\', $posts );
只是关于这个问题的一些想法。。

相关推荐

如何像使用wpdb一样使用MySQL?

根据标题,我需要使用LIKE操作符以编程方式使用$wpdb删除db上的一行。我想使用$wpdb->delete 消除发生的情况,但我不知道如何设置LIKE 操作员,因为在WHERE 它需要一个指定单个值或另一个数组的数组。我问你这个语法是否正确。$wpdb->delete(\'wp_posts\', array(\'post_type\' => \'flamingo_inbound\', \'post_content\' => \'%\'.$mail.\'%\'));提前感谢