[英]Cleanest way to check if a record exists
我正在使用以下代码来检查数据库中是否存在行:
$sql = "SELECT COUNT(1) FROM myTable WHERE user_id = :id_var";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':id_var', $id_var);
$stmt->execute();
if ($stmt->fetch()[0]>0)
{
//... many lines of code
}
所有代码都有效,并且我担心以前的代码是否干净高效,是否还有改进的余地。
目前,有两个问题困扰着我之前的代码:
LIMIT 1
吗? COUNT(1)
是否COUNT(1)
找到的行数限制为1,或者服务器在找到第一个记录后仍继续搜索更多记录? if ($stmt->fetch()[0]>0)
。 这是从SQL查询中获取信息并执行“如果有条件的话”的最干净的方法吗? 当然,如果有人发现任何可以改善我的代码的东西,我将很高兴收到您的反馈。
问:我的SQL语句结尾是否应该有LIMIT 1? COUNT(1)是否已将找到的行数限制为1,或者服务器在找到第一个记录后仍继续搜索更多记录?
如果执行成功,因为没有GROUP BY子句,则SELECT COUNT() FROM
查询将返回一行。 无需添加LIMIT 1子句,不会有任何影响。
数据库将搜索满足WHERE子句中条件的所有行。 如果user_id列是UNIQUE,并且有一个索引作为前导列,或者,如果该列是表的PRIMARY KEY ...,那么使用索引来搜索所有匹配的行将非常有效。 如果没有索引,则MySQL将需要搜索表中的所有行。
可以为您带来良好业绩的指标 。 您可以不同地编写查询,以获得可用的结果。 但是你所拥有的很好。
问:这是最干净的吗?
if ($stmt->fetch()[0]>0)
我个人的喜好是避免这种构造,并将其分解为两个或多个陈述。 正常模式...单独的语句来获取行,然后进行测试。
就个人而言,我倾向于避免使用COUNT()而只获取一行,并测试是否有要获取的行...
$sql = "SELECT 1 AS `row_exists` FROM myTable WHERE user_id = :id_var";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':id_var', $id_var);
$stmt->execute();
if($stmt->fetch()) {
// row found
} else {
// row not found
}
$stmt->closeCursor();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.