Эффективное получение количества строк, возвращаемых SELECT-запросом, с предложением WHERE с использованием PDO

Существует много дискуссий о 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."; } 

    При использовании MySQL PDOStatement::rowCount() возвращает количество строк в наборе результатов. Он фактически вызывает основную функцию mysql_num_rows() C для заполнения значения. Нет необходимости в нескольких запросах или каких-либо других беспорядках.

    Это относится и к MySQL, но для других драйверов это поведение нельзя полагаться (другие могут его поддержать, но это не гарантировано, я не знаком с другими, чтобы сказать наверняка в любом случае). Но поскольку ваш вопрос касается конкретно MySQL, он должен служить вашим целям.

    Попробуйте эту встроенную функцию PDO; $ Query-> сверка ();