Как мне ВЫБРАТЬ и ПОСЧИТАТЬ строки в SQL?

#php #sql

#php #sql

Вопрос:

Как мне получить результаты и посчитать их в одном запросе? (Я использую инструкции PDO)

 SELECT * FROM table; // gets results
SELECT COUNT(*) FROM table; // counts results
  

Комментарии:

1. Если бы вы использовали один запрос, как бы вы хотели, чтобы выглядели ваши результаты?

2. Кроме того, какой вариант sql вы используете?

3. GROUP BY...WITH ROLLUP возможно ли?

4. Почему это должен быть один запрос?

Ответ №1:

 $result = mysql_query( "SELECT * FROM table");
$count = mysql_num_rows( $result);
  

Использование PDO:

 $statement = $dbh->prepare('SELECT * FROM table');
$statement->execute();
$count = $statement->rowCount();
  

Комментарии:

1. Это не работает с инструкцией PDO, есть ли что-то подобное, что работает с PDO?

2. В вашем OP ничего не упоминается о PDO, но вы можете использовать функцию rowCount, хотя она не так надежна, как описанная выше — us3.php.net/manual/en/pdostatement.rowcount.php

Ответ №2:

Это приведет к тому, что количество записей будет помещено в конец каждой строки.

 SELECT *
   , COUNT(1) OVER () AS RecordCount
FROM table;
  

Ответ №3:

 SELECT *, (select count(*) FROM table) ct FROM table
  

Комментарии:

1. На самом деле это два запроса к таблице, но возвращаемые в одном наборе результатов.

2. -1 отрицательный голос за то, что не ответил на вопрос OP: запрос предназначен для одного запроса.

3. Это одна инструкция, которая возвращает один ответ. Можете ли вы указать мне ссылку, которая определяет инструкцию SQL с подвыбором не как «один запрос»?

4. У меня нет определения для вас. Проблема, с которой я столкнулся с этим ответом, заключалась в том, что если вы посмотрите на план выполнения запроса, сравнивая его либо с моим ответом, либо с nickb, этот ответ в два раза медленнее. Это связано со вторым сканированием таблицы table . Я полагаю, что целью OP было запросить запрос, который не требует второго сканирования.

5. Я интерпретировал, что он не хотел подвергаться задержке двух отдельных выборок по своей сети между веб-сервером и базой данных. Я рад, что вы нашли более оптимальное решение, но не согласен с вашим мнением о нарушениях.

Ответ №4:

вы должны выполнить только один запрос…

 $sql = SELECT * FROM table;
$res = mysql_query($sql);
  

вы можете получить общее количество с помощью функции mysql_num_rows(); .. вот так ..

 $count = mysql_num_rows($res);