На SO ведутся многочисленные обсуждения того, как получить число строк, возвращенных при выполнении запроса SELECT
с использованием PDO. Хотя большинство (включая руководство по PHP) предлагают использовать два запроса, причем первый запуская COUNT()
, я не видел ни одного, который предлагал бы легко сделать это, используя подготовленные операторы с предложениями WHERE
.
Как мне наиболее эффективно (как с точки зрения обработки, так и с точки зрения количества строк кода) запустить COUNT()
, используя одно и то же предложение WHERE
? В подготовленном запросе уже указаны столбцы. fetchAll()
здесь не сработает, потому что это не масштабируется; если мне нужно вернуть миллионы строк, обработка их с помощью fetchAll будет очень медленной.
Например, без подсчета:
$sql = "SELECT
FirstName,
LastName
FROM
People
WHERE
LastName = :lastName";
$query = $pdoLink->prepare($sql);
$query->bindValue(":lastName", '%Smith%');
$query->execute();
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
echo $row['FirstName'] . " " . $row['LastName'];
}
Я посмотрел на простое добавление COUNT(ID)
к предложению SELECT
и на то, чтобы это был всего один запрос, но похоже, что нет действительно хорошего способа (или не зависящего от базы данных) способа перемотки fetch()
после того, как я получаю от него строку.
Другое решение может состоять в том, чтобы сделать предложение WHERE
собственной переменной, которая создается. Но это кажется не очень эффективным. Он готовит два запроса, снова связывает значения и выполняет их.
Что-то вроде:
$whereClause = " WHERE
LastName = :lastName";
$rowsSql = "SELECT
COUNT(ID) As NumOfRows
FROM
People " . $whereClause;
$rowsQuery = $pdoLink->prepare($sql);
$rowsQuery->bindValue(":lastName", '%Smith%');
$rowsQuery->execute();
if ($rowsQuery->fetchColumn() >= 1)
//Prepare the original query, bind it, and execute it.
$sql = "SELECT
FirstName,
LastName
FROM
People " . $whereClause;
$query = $pdoLink->prepare($sql);
$query->bindValue(":lastName", '%Smith%');
$query->execute();
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
echo $row['FirstName'] . " " . $row['LastName'];
}
}
else
{
//No rows found, display message
echo "No people found with that name.";
}
WHERE
. Мой вопрос касается того, как эффективно это сделать, используя предложениеWHERE
. - person Luke Shaheen   schedule 08.04.2013SELECT
с использованием предложенияWHERE
. То, что находится в пунктеWHERE
, не должно иметь значения. - person Luke Shaheen   schedule 09.04.2013GROUP BY
позволит моему PHP-коду узнать, возвращаются ли строки или нет? Смысл здесь в том, чтобы отобразить сообщение, если строки не найдены, иначе напечатать строки. - person Luke Shaheen   schedule 09.04.2013HAVING
, чтобы он не возвращал строк, где счетчик равен 0 - person Miguelo   schedule 09.04.2013fetchAll
должен подойти для вашего примера, потому что ваш результирующий набор не содержит много строк. Вы можете использовать PHPcount
для подсчета строк. - person bitWorking   schedule 09.04.2013fetchAll
в этих случаях было бы очень неэффективным. - person Luke Shaheen   schedule 09.04.2013SQLite
, я спрашиваю оMySQL
. На этот вопрос нет принятого ответа, а ответ, набравший наибольшее количество голосов, не показывает наиболее эффективный способ выполнения обоих запросов; он просто показывает выполнение запросаCOUNT()
. - person Luke Shaheen   schedule 09.04.2013