Mysql ВЫБРАТЬ СЧЕТ (*) ИЛИ ВЫБРАТЬ 1?PDO - PullRequest
2 голосов
/ 22 ноября 2011

Давно известно, что PDO не поддерживает COUNT (*), и запрос, подобный приведенному ниже, не будет выполнен, поскольку он не вернет никаких затронутых строк,

$q = $dbc -> prepare("SELECT COUNT(*) FROM table WHERE id = ?");
$q -> execute(array($id));
echo $q -> rowCount();

Проведя некоторые исследования, я обнаружил, что вы также можете получить счетчик строк, используя другие методы подсчета и вообще не используя счетчик, например, следующий запрос должен быть таким же, как указано выше, но вернёт правильный для PDO,

$q = $dbc -> prepare("SELECT 1 FROM table WHERE id = ?");
$q -> execute(array($id));
echo $q -> rowCount();

В Интернете есть разные источники, утверждающие, что

"SELECT COUNT(*)
"SELECT COUNT(col)
"SELECT 1

Все они одинаковы (с некоторыми отличиями), так почему же с помощью mysql PDO не может правильно вернуть истинный счет,

"SELECT 1 

работа

Методы подсчета обсуждений

Почему Select 1 быстрее, чем Select count (*)?

Ответы [ 3 ]

6 голосов
/ 22 ноября 2011

О. Вы все путаете.

  1. PDO не мешает SQL-запросам. Он поддерживает ВСЕ, поддерживаемое SQL.
  2. При выполнении COUNT(*) вы вообще не должны использовать rowcount, поскольку это просто не имеет смысла. Вместо этого вы должны получить результат запроса.
  3. Не знаю, о каких "различных источниках" вы говорите, но COUNT(*) и COUNT(col) (и даже COUNT(1)) одинаковы и единственный правильный способ подсчета записей, когда вам нужно самих записей нет.

COUNT - это агрегатная функция, она подсчитывает строки для вас . Таким образом, он уже возвращает результат, больше не требуется подсчет. Ad возвращает только скалярное значение в одной строке. Таким образом, использование rowcount в этом единственном ряду не имеет смысла

SELECT 1 - это не то же самое, что и выше, поскольку он выбирает буквально 1 для каждой строки в таблице . Таким образом, он вернет тысячу 1s, если в вашей базе данных есть тысячи строк. Таким образом, rowcount даст вам результат, но это будет чрезмерной тратой ресурсов сервера.

есть простое правило, которому нужно следовать:

Всегда запрашивайте только те данные, которые вам нужны.

Если вам нужно количество строк - запросите количество строк. Не тысяча 1, чтобы посчитать их позже.
Звучит разумно?

5 голосов
/ 22 ноября 2011

PDO не поддерживает COUNT (*)

WTF?Конечно, PDO поддерживает COUNT(*), вы используете его неправильно.

$q = $dbc->prepare("SELECT COUNT(id) as records FROM table WHERE id = ?");
$q->execute(array($id));    
$records = (int) $q->fetch(PDO::FETCH_OBJ)->records;

Если вы используете драйвер, отличный от MySQL, вам, возможно, придется сначала протестировать rowCount, например, так.

$records = (int) ($q->rowCount()) ? $q->fetch(PDO::FETCH_OBJ)->records : 0;
0 голосов
/ 05 декабря 2012

Лучший способ проверить, существует ли строка в вашей базе данных, - это выполнить.

SELECT 1 FROM table WHERE condition LIMIT 1

Если он найдет строку, он остановится и скажет вам, что есть строка.Если этого не произойдет, и у вас есть индекс в столбце условия where, он также очень быстро обнаружит, что его нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...