[英]Optimization for this SQL query?
I have a WordPress site and I make a query to get all the users that have a specific capability/range.我有一个 WordPress 网站,我进行了查询以获取具有特定功能/范围的所有用户。 From the list, I get a "meta_value" that has a timestamp, and then I check if it is less than the current time (expired)从列表中,我得到一个带有时间戳的“meta_value”,然后我检查它是否小于当前时间(已过期)
$sql = "SELECT user_id
FROM `wp_usermeta`
WHERE `meta_key` = 'wp_capabilities'
AND `meta_value` LIKE '%\"premium\"%'";
$query = mysqli_query($cn, $sql);
while ($row = mysqli_fetch_array($query))
{
$user_id = $row["user_id"];
$sql = "SELECT meta_value
FROM `wp_usermeta`
WHERE `meta_key` = '_expire_user_date'
AND user_id = '$user_id'";
$query_time = mysqli_query($cn, $sql);
$rows_query_time = mysqli_fetch_array($query_time);
$expire_user_date = $rows_query_time["meta_value"];
$now = time();
if ($expire_user_date && $now > $expire_user_date)
{
echo $user_id." expired<br>";
}
}
It's possible to use JOIN or something to optimize the query?可以使用 JOIN 或其他东西来优化查询吗?
Thanks in advance提前致谢
Try self join query on usermeta
table in WordPress在 WordPress 中尝试对usermeta
表进行自usermeta
查询
SELECT * FROM `wp_usermeta` um1 join `wp_usermeta` um2
ON um1.user_id = um2.user_id
AND um1.meta_key = 'wp_capabilities'
AND um1.meta_value LIKE '%premium%'
AND `um2`.`meta_key` = '_expire_user_date
Left Join
or subquery
will work. Left Join
或subquery
将起作用。 I think Left Join
will be optimal one我认为Left Join
将是最佳选择
"SELECT umeta.user_id,
exmeta.meta_value as meta_value
FROM `wp_usermeta` AS umeta
LEFT JOIN `wp_usermeta` AS exmeta
ON umeta.user_id = exmeta.user_id
WHERE umeta.`meta_key` = 'wp_capabilities'
AND umeta.`meta_value` LIKE '%\"premium\"%'
AND exmeta.`meta_key` = '_expire_user_date'
";
But easiest one is subquery
which is little bit slower than left join但最简单的是subquery
,它比左连接慢一点
"SELECT user_id,
(SELECT meta_value
FROM `wp_usermeta`
WHERE user_id = umeta.user_id
AND `meta_key` = '_expire_user_date'
LIMIT 1
) as meta_value
FROM `wp_usermeta` AS umeta
WHERE `meta_key` = 'wp_capabilities'
AND `meta_value` LIKE '%\"premium\"%'";
It's better to let the database manage the filtering.最好让数据库管理过滤。 Try something like this:尝试这样的事情:
"SELECT user_id
FROM `wp_usermeta`
WHERE `meta_key` = 'wp_capabilities'
AND `meta_value` LIKE '%\"premium\"%'"
AND 'timestamp_column' > NOW()
Than you get all the "expired" rows.比你得到所有“过期”的行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.