Ion*_*ula 7 php mysql sql wordpress
我试图从WordPress中的数据库查询我的表中的列上每条记录存在多少次并导出该列.我该怎么做?
在excel导出中,我希望meta_value中的列包含meta_key"user_valid",列中包含meta_value在mysql列中存在的次数.
meta_key meta_value
user_valid '1, 2, 3'
user_valid '1, 2, 1'
user_valid '1, 2, 3'
Run Code Online (Sandbox Code Playgroud)
要使用我使用的meta_key'user_valid'导出列'meta_value':
SELECT meta_value FROM `us_test` WHERE meta_key = 'user_valid'
Run Code Online (Sandbox Code Playgroud)
在使用此查询后,我使用MYSQL中的导出按钮导出.
我不知道如何对其他列进行查询.
我认为它应该是这样的,但我不确定,因为当我使用下一个查询时,它不会返回所有记录:
SELECT meta_value, COUNT( * ) c FROM `us_test` WHERE meta_key = 'user_valid' GROUP BY meta_value
Run Code Online (Sandbox Code Playgroud)
这里有两个选项,Wordpress方式和另一种方式SQL.
就在我开始之前,你永远不应该对数据库名称进行硬编码,问题是,如果你将代码移动到具有不同数据库名称的另一个网站,你需要在所有查询中更改数据库名称,当你更改您正在使用的站点上的数据库名称.如果您忘记这一点,这可以让您进行疯狂的追逐
您应 始终始终清理并验证输入数据,以确保可以安全地防止将任何恶意代码注入您的站点.SQL注入很常见,许多黑客使用SQL注入来破解网站
由于动态性较差,SQL可以减少一点控制.例如,如果您只需要获取某个术语的计数,则需要直接更改查询,否则您需要实现某种过滤系统.
正如我所说,永远不要硬编码db名称,而是使用wpdb类来设置前缀.这将避免问题的发生.另外,正如我所说,你必须进行清理以避免SQL注入,在这种情况下,我们将使用preparewpdb类的方法来处理卫生并防止SQL注入.
这是函数,我在这里和那里评论有意义:
function get_post_meta_key_count( $key = '', $value = '', $type = 'post', $status = 'publish' )
{
// Use $wpdb to avoid bugs and errors, do not hardcode db names
global $wpdb;
if( empty( $key ) )
return;
// Set the default WHERE clause where we return the count of the key regardless of value
$where = $wpdb->prepare(
"
pm.meta_key = '%s'
AND p.post_type = '%s'
AND p.post_status = '%s'
",
$key,
$type,
$status
);
// If a value is specified, add that to the WHERE clause
if ( $value ) {
$where .= $wpdb->prepare(
"
AND pm.meta_value = '%s'
",
$value
);
}
// Query the db to return the post count according to key and value if value is set
$count = $wpdb->get_var(
"
SELECT count(DISTINCT pm.post_id)
FROM {$wpdb->postmeta} pm
JOIN {$wpdb->posts} p ON (p.ID = pm.post_id)
WHERE {$where}
"
);
return $count;
}
Run Code Online (Sandbox Code Playgroud)
我在这里做的是,如果你需要获取特定元键的特定元值的计数,我已经设置了一个参数.
用法
您现在可以使用以下功能:
echo get_post_meta_key_count( 'my_key' );用于meta_key my_key默认帖子类型的帖子计数post和仅发布的帖子
echo get_post_meta_key_count( 'my_key', '', 'custom_post_type', 'trash' );用于meta_key my_key自定义帖子类型的帖子计数custom_post_type和仅删除的帖子
echo get_post_meta_key_count( 'my_key', 'my_value' );为岗位数的meta_key my_key 和为meta_value,my_value默认类型后post,只有发布的文章
WP_Query如果您正在寻找构建方式(这应该始终是您的第一个选项),您可以使用WP_Query该类来执行此操作.
使用的问题WP_Query是,如果使用不当,它可能会非常昂贵.许多人WP_Query因此而避免,或者在不知情的情况下运行非常昂贵且不必要的查询.因此,我们将研究一种与自定义SQL查询一样快的方法.
WP_Query上面的自定义SQL查询的真正优点是,您可以通过简单地传递所需的参数来调整查询,WP_Query将始终负责根据传递的参数构建正确的SQL查询.
让我们看看优化WP_Query,以便只返回一个帖子计数
首先,我们只会查询一个帖子.WP_Query默认情况下,无论是查询了多少帖子(1,100或所有帖子),WP_Query都会继续查找与查询匹配的所有帖子,即使它已找到并返回查询的帖子数量.这样做的原因是分页.为了正确计算分页,WP_Query需要知道有多少帖子与查询匹配.
因此WP_Query,在返回查询的帖子数量之后继续查看数据库,以便计算与查询匹配的所有帖子.此帖子计数存储在$found_posts查询的属性中,与此一起posts_per_page使用的数字用于计算将有多少页面.
get_posts虽然get_posts使用,但这不起作用WP_Query.一旦找到查询的帖子数量,就会get_posts传递'no_found_rows' => true到WP_Query查询中断查询.这在法律上打破了分页,这就是为什么get_posts如此严重的分页正确分页
其次,我们只查询我们需要查询的单个帖子的ID,而不是查询完整的WP_Post对象.这节省了查询时间.
那么让我们来看看这个函数:
function get_post_meta_key_count( $key = '', $value = '', $args = [] )
{
// If the $key value is empty, bail
if( empty( $key ) )
return;
// Set the defaults and override any value set for the specific default
$args['posts_per_page'] = 1;
$args['fields'] = 'ids';
if ( $value ) {
$args['meta_query'][] = [
'key' => $key,
'value' => $value
];
} else {
$args['meta_query'][] = [
'key' => $key,
];
}
$q = new WP_Query( $args );
// Return the post count
return $q->found_posts;
}
Run Code Online (Sandbox Code Playgroud)
用法
WP_Query默认情况下,使用post帖子类型和publish帖子状态,因此我们不需要为正常发布的帖子设置此项.我在这里调用了第三个参数$args,这个参数接受与WP_Query类完全相同的参数,因为它们都直接传递给了WP_Query.因此,您可以在此处添加任何参数以从特定元键或值中获取计数
echo get_post_meta_key_count( 'my_key' );用于meta_key my_key默认帖子类型的帖子计数post和仅发布的帖子
echo get_post_meta_key_count( 'my_key', 'my_value' );为岗位数的meta_key my_key 和为meta_value,my_value默认类型后post,只有发布的文章
echo get_post_meta_key_count( 'my_key', 'my_value', ['post_type'=>'cpt', 'cat'=>1] );为岗位数的meta_key my_key 和为meta_value,my_value自定义类型后cpt,只发表文章类别ID1
meta_key有24个帖子SQL - > 1次查询+/- 0.005秒
WP_Query - > + 2个查询+/- 0.012秒
正如您所看到的,性能上存在微小差异,因此该WP_Query方法很容易成为最佳选择,因为它更加动态,即使速度稍慢
所以,我会回答我自己的问题:
我的问题中的查询是绝对正确的:
SELECT meta_value, COUNT( * ) c FROM `us_test` WHERE meta_key = 'user_valid' GROUP BY meta_value
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1191 次 |
| 最近记录: |