我使用以下代码检查数据库中是否存在行:
$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)
是否已将发现的行数限制为1,或者即使在找到第一个记录之后服务器是否继续搜索更多记录?if ($stmt->fetch()[0]>0)
。这是从SQL查询中获取信息并执行“if conditional”的最简洁方法吗?当然,如果有人发现任何其他可以改善我的代码的内容,我会很乐意反馈你。
答案 0 :(得分:3)
问:我的SQL语句结尾处是否应该有LIMIT 1? COUNT(1)是否已将发现的行数限制为1,或者即使在找到第一个记录之后服务器是否继续搜索更多记录?
如果执行成功,您的SELECT COUNT() FROM
查询将返回一行,因为没有GROUP BY子句。没有必要添加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();