[英]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.