Ответ 1
попробуйте этот путь
select (select count() from XXX) as count, *
from XXX;
Я хочу получить количество выбранных строк, а также выбранные данные. В настоящее время я должен использовать два sql-оператора:
один
select * from XXX where XXX;
другой
select count(*) from XXX where XXX;
Может ли это быть реализовано с помощью одной строки sql?
Я проверил исходный код sqlite3, и нашел функцию sqlite3_changes()
. Но функция полезна только при изменении базы данных (после insert, delete or update
).
Может ли кто-нибудь помочь мне с этой проблемой? Большое вам спасибо!
попробуйте этот путь
select (select count() from XXX) as count, *
from XXX;
SQL не может смешивать однострочные (подсчетные) и многострочные результаты (выбор данных из ваших таблиц). Это общая проблема с возвратом огромного количества данных. Вот несколько советов, как справиться с этим:
Прочитайте первые N строк и сообщите пользователю "больше, чем N строк". Не очень точный, но часто достаточно хороший. Если вы держите курсор открытым, вы можете получить больше данных, когда пользователь попадет в нижнюю часть представления (Google Reader делает это)
Вместо прямого выбора данных сначала скопируйте его во временную таблицу. Оператор INSERT вернет количество скопированных строк. Позже вы можете использовать данные во временной таблице для отображения данных. Вы можете добавить "номер строки" в эту временную таблицу, чтобы сделать пейджинг более простым.
Получить данные в фоновом потоке. Это позволяет пользователю использовать ваше приложение, когда сетка данных или таблица заполняются с большим количеством данных.
select (select COUNT(0)
from xxx t1
where t1.b <= t2.b
) as 'Row Number', b from xxx t2 ORDER BY b;
просто попробуйте this.
Вы можете объединить их в один оператор:
select count(*), * from XXX where XXX
или
select count(*) as MYCOUNT, * from XXX where XXX
Как только у вас уже есть результаты select * from XXX
, вы можете просто найти длину массива в своей программе?
Если вы используете sqlite3_get_table
вместо подготовки/шага/завершения, вы получите сразу все результаты в массиве ( "результат table" ), включая номера и имена столбцов и количество строк. Затем вы должны освободить результат с помощью sqlite3_free_table
Вы должны попробовать следующее:
select (select count() from XXX) as count, * from XXX;
Чтобы получить количество уникальных заголовков, необходимо передать предложение DISTINCT в функцию COUNT в виде следующего оператора:
SELECT
COUNT(DISTINCT column_name)
FROM
'table_name';
Источник: http://www.sqlitetutorial.net/sqlite-count-function/
Для тех, кто все еще ищет другой метод, более изящный, который я нашел, чтобы получить общее количество строк, заключался в использовании CTE. это гарантирует, что счет рассчитывается только один раз:
WITH cnt(total) as (SELECT COUNT(*) from xxx) select * from xxx,cnt
единственный недостаток - если требуется предложение WHERE, его следует применять как в основном запросе, так и в запросе CTE.
В первом комментарии Alttag сказал, что нет проблем с выполнением 2 запросов. Я не согласен с этим, если оба не являются частью уникальной сделки. Если нет, исходная таблица может быть изменена между двумя запросами любым INSERT или DELETE из другого потока/процесса. В таком случае значение счетчика может быть неправильным.