Php 如何计算某个meta_键在列中显示meta_值的次数?
我试图从WordPress的数据库中查询每个记录在我的表中的一列上存在的次数,并导出该列。我该怎么做 在导出的excel中,我想让meta_键为“user_valid”的from meta_value列和一个计数该meta_值在mysql列中存在多少次的列Php 如何计算某个meta_键在列中显示meta_值的次数?,php,mysql,sql,wordpress,Php,Mysql,Sql,Wordpress,我试图从WordPress的数据库中查询每个记录在我的表中的一列上存在的次数,并导出该列。我该怎么做 在导出的excel中,我想让meta_键为“user_valid”的from meta_value列和一个计数该meta_值在mysql列中存在多少次的列 meta_key meta_value user_valid '1, 2, 3' user_valid '1, 2, 1' user_valid '1, 2, 3'
meta_key meta_value
user_valid '1, 2, 3'
user_valid '1, 2, 1'
user_valid '1, 2, 3'
对于使用meta_键“user_valid”导出列“meta_value”:
SELECT meta_value FROM `us_test` WHERE meta_key = 'user_valid'
使用此查询后,我使用export按钮从MYSQL导出
我不知道如何查询另一列
我认为应该是这样,但我不确定,因为当我使用下一个查询时,它不会返回所有记录:
SELECT meta_value, COUNT( * ) c FROM `us_test` WHERE meta_key = 'user_valid' GROUP BY meta_value
因此,我将回答我自己的问题: 我的问题中的疑问绝对正确:
SELECT meta_value, COUNT( * ) c FROM `us_test` WHERE meta_key = 'user_valid' GROUP BY meta_value
这里有两种选择,Wordpress方式和SQL方式 在我开始之前,您永远不应该硬编码db名称,问题是,如果您将代码移动到另一个具有不同db名称的网站,并且在您正在工作的网站上更改db名称,那么您需要在所有查询中更改db名称,而这是硬编码。如果你忘记了这一点,这会让你陷入白费力气 您应该始终清理和验证输入数据,以确保安全,防止任何恶意代码被注入您的站点。SQL注入很常见,许多黑客使用SQL注入攻击网站 SQL SQL给人的控制力要小一些,因为它不太动态。例如,如果只需要获取某个术语的计数,则需要直接更改查询,或者需要实现某种过滤系统 正如我所说的,永远不要硬编码db名称,而是使用wpdb类来设置前缀。这将避免未来的问题。另外,正如我所说,您必须进行清理以避免SQL注入,在这种情况下,我们将使用wpdb类的
prepare
方法来处理卫生问题,并防止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;
}
我在这里做的是,如果您需要获取特定元键的特定元值的计数,我设置了一个参数
用法
您现在可以按如下方式使用该功能:
用于默认帖子类型echo get_post_meta_key_count('my_key')
的post
的帖子计数,仅用于发布的帖子meta\u key
用于自定义帖子类型的echo get_post_meta_key_count('my_key','custom_post_type','trash')
meta_key
的帖子计数my_key
用于自定义帖子类型
且仅用于垃圾帖子
对于echo get_post_meta_key_count('my_key','my_value')
meta\u key
的帖子计数,对于my\u key
,meta\u value
对于默认帖子类型my\u value
,仅发布帖子post
WP\u查询
如果您正在寻找一种内置方式来实现这一点(这应该是您的第一个选择),那么您可以使用WP\u Query
类来实现
使用WP\u Query
的问题是,如果使用不当,可能会非常昂贵。因此,许多人避免使用WP\u Query
,或者在不知不觉中运行非常昂贵且不必要的查询。因此,我们将研究一种方法,使其与自定义SQL查询一样快
与自定义SQL查询相比,WP\u Query
的真正优势在于,您可以通过简单地传递所需的参数来调整查询,WP\u Query
将始终负责根据传递的参数构造适当的SQL查询的艰苦工作
让我们看一下优化WP\u查询
,以便只返回post计数
- 首先,我们只查询一篇文章<默认情况下,
的构建方式是,无论查询多少帖子(1100篇或所有帖子),WP\u Query
将继续查找与查询匹配的所有帖子,即使它已经找到并返回了查询的帖子数量。原因是分页。为了正确计算分页,WP\u Query
需要知道与查询匹配的帖子数量 因此,WP_Query
在返回查询的帖子数量后,继续查看数据库,以便统计与查询匹配的所有帖子。此帖子计数存储在查询的WP_Query
属性中,此数字与每页$found\u posts
posts\u一起使用,用于计算将有多少页面 这不适用于
,尽管get_posts
使用get_posts
WP_Query
将get_posts
传递到'no_found_rows'=>true
,一旦找到查询的posts数量,就会中断查询。这在法律上破坏了分页,这就是为什么正确分页是如此令人头痛的问题WP_Query
- 其次,我们将只查询需要查询的单个post的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;
}
用法
WP\u Query
,默认情况下,使用post
post类型和publish
作为post状态,因此我们不需要为正常发布的帖子设置此选项。我在这里包含了第三个参数,名为$args
,该参数接受与WP\u Query
类相同的精确参数,因为这些参数都直接传递给WP\u Query
。因此,您可以在这里添加任何参数,以从特定的元键o获取计数