【问题标题】:Optimization for this SQL query?此 SQL 查询的优化?
【发布时间】:2019-08-07 04:05:46
【问题描述】:

我有一个 WordPress 网站,我进行查询以获取所有具有特定能力/范围的用户。从列表中,我得到一个带有时间戳的“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>";
    }
}

可以使用JOIN之类的优化查询吗?

提前致谢

【问题讨论】:

  • 您是否在寻找已过期且具有特定功能的用户?
  • 你好。是的,谁已过期并具有“高级”功能。
  • 你应该使用准备好的语句,否则你的代码容易受到 SQL 注入的攻击。

标签: php mysql sql wordpress


【解决方案1】:

在 WordPress 中尝试对 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

【讨论】:

  • 谢谢,我的最终查询是:SELECT um2.meta_value 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' 所以它可以帮助我检查每一行的时间
【解决方案2】:

Left Joinsubquery 将起作用。我认为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'

";

但最简单的是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\"%'";

【讨论】:

  • 您好!查询返回我“字段列表中的列'user_id'不明确”,顺便感谢您的回复:-)
  • @JasonDerek 非常感谢,我更新了我的答案。谢谢指正。 LEFT JOIN 是最快的。
【解决方案3】:

最好让数据库管理过滤。 试试这样的:

"SELECT user_id
FROM  `wp_usermeta` 
WHERE  `meta_key` =  'wp_capabilities'
AND  `meta_value` LIKE  '%\"premium\"%'"
AND 'timestamp_column' > NOW()

比你得到所有“过期”的行。

【讨论】:

  • 您好!在这种情况下,时间戳不在列内。感谢回复
猜你喜欢
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多