#postgresql #count #group-by #sql-order-by #aggregate-functions
#postgresql #количество #group-by #sql-order-by #агрегатные функции
Вопрос:
Я обновляю программное обеспечение Qt, чтобы сделать его совместимым как с SQLite, так и с PostgreSQL. У меня есть метод C , который используется для подсчета элементов заданной таблицы с заданными предложениями.
В SQLite сработало следующее и дало мне число N (количество).
SELECT COUNT(*) FROM table_a
INNER JOIN table_b AS
ON table_b.fk_table_a = table_a.id
WHERE table_a.start_date_time <> 0
ORDER BY table_a.creation_date_time DESC
В PostgreSQL (я использую 9.3) у меня следующая ошибка :
ОШИБКА: столбец «table_a.creation_date_time» должен отображаться в предложении GROUP BY или использоваться в агрегатной функции СТРОКА 5: ПОРЯДОК ПО table_a.creation_date_time DESC
Если я добавлю, GROUP BY table_a.creation_date_time , это даст мне таблицу с N строками. Я много читал о том, как разные СУБД позволяют опускать столбцы в предложении GROUP BY . Теперь я просто в замешательстве.
Для тех, кому интересно, метод C :
static int count(const QString amp;table, const QString amp;clauses = QString(""))
{
int success = -1;
if (!table.isEmpty())
{
QString statement = QString("SELECT COUNT(*) FROM ");
statement.append(table);
if (!clauses.isEmpty())
{
statement.append(" ").append(clauses) ;
}
QSqlQuery query;
if(!query.exec(statement))
{
qWarning() << query.lastError();
qWarning() << statement;
}
else
{
if (query.isActive() amp;amp; query.isSelect() amp;amp; query.first())
{
bool ok = false;
success = query.value(0).toInt(amp;ok);
if (ok == false)
{
success = -1;
return success;
}
}
}
}
return success;
}
Комментарии:
1. Тогда SQLite И MySQL «расслаблены».
Ответ №1:
Если вы просто выполняете a count(*)
в таблице, чтобы получить результат с одним скалярным значением, то, конечно, наличие order by
present устарело?
решение
Удалите устаревшее order by
, чтобы получить «стандартное» поведение запросов в нескольких СУБД
Комментарии:
1. Жена: Я хочу пить. Я: Вот стакан воды. Жена: Я не просила стакан воды, я хотела, чтобы ты сочувствовал мне в моих проблемах с жаждой. Я: Извини, детка, я все об устранении проблемы
2. Кэмпбелл, я видел, что это работает, если я удаляю
ORDER BY table_a.creation_date_time DESC
. Дело в том, что при вызове метода параметр clauses уже содержит оператор GROUP BY . Возможно, мне следует удалять это утверждение перед каждым вызовом метода, поскольку, как вы говорите, я использую только одно скалярное значение каждый раз, когда я его вызываю.3. бах. трусливое удаление комментария @a_horse_with_no_name 😉
4. Я не знаю, что произошло с комментарием @a_horse_with_no_name . Я увидел, что он уже был удален, когда я ответил на него. Он процитировал меня, чтобы сказать мне, что MySQL «расслаблен» в своем способе обработки оператора GROUP BY, который некоторые люди считают ошибкой или чем-то в этом роде.