Отсутствует возможность использовать предложение HAVING в SQL в F3

#mysql #fat-free-framework

#mysql #fat-free-framework

Вопрос:

Есть ли способ использовать предложение HAVING для MySQL с любым из методов SQL Mapper объекта Fat Free Framework? Давайте предположим, что у меня есть следующая таблица БД:

  ---- ------- -------- 
| id | score | weight |
 ---- ------- -------- 
|  2 |     1 |      1 |
|  2 |     2 |      3 |
|  2 |     3 |      1 |
|  2 |     2 |      2 |
|  3 |     1 |      4 |
|  3 |     3 |      1 |
|  3 |     4 |      3 |
 ---- ------- -------- 
  

Теперь я хотел бы выполнить следующий запрос:

 SELECT id, SUM(score*weight)/SUM(weight) AS weighted_score GROUP BY id HAVING weighted_score>2
  

По правде говоря, я действительно хотел бы подсчитать количество этих записей, но count метод не поддерживается $options .

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

РЕДАКТИРОВАТЬ 1: способ, которым я знаю, как это сделать, если нет поддержки HAVING предложения (на основе руководства):

 $databaseObject = new DBSQL(...);
$dataMapper = new DBSQLMapper($databaseObject, "tableName");
$dataMapper->weightedScore = "SUM(weight*score)/SUM(weight)";
$usersInfo = $dataMapper->find([],["group"=>"id"]);
$place = 1;
foreach ( $usersInfo as $userInfo ) {
    if ( $usersScores->weightedScore > 2) $place  ;
}
  

Если бы я мог использовать HAVING предложение, цикл foreach не понадобился бы, и количество элементов, загружаемых запросом, было бы уменьшено:

 $databaseObject = new DBSQL(...);
$dataMapper = new DBSQLMapper($databaseObject, "tableName");
$dataMapper->weightedScore = "SUM(weight*score)/SUM(weight)";
$usersInfo = $dataMapper->find([],["group"=>"id", "having"=>"weighted_score<2"]); // rough idea
$place = count($usersInfo);
  

И если бы count метод поддерживался $options , это было бы еще проще, и это сэкономило бы память, используемую приложением, поскольку никакие записи не будут загружены:

 $databaseObject = new DBSQL(...);
$dataMapper = new DBSQLMapper($databaseObject, "tableName");
$dataMapper->weightedScore = "SUM(weight*score)/SUM(weight)";
$place = $dataMapper->count([],["group"=>"id", "having"=>"weighted_score<2"]); // rough idea
  

Ответ №1:

Используйте вспомогательный запрос.

 select count (0) from (SELECT id, SUM(score*weight)/SUM(weight) AS weighted_score GROUP BY id) where weighted_score>2;
  

Надеюсь, это поможет.

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

1. Верно, но это все еще простой ванильный SQL. Что я хотел знать, так это то, можно ли это сделать с помощью Fat Free Framework SQL mapper. Это расширяет PDO PHP, поэтому, возможно, есть способ сделать это на уровне PDO… Я обновлю свой вопрос примером того, как я хотел бы иметь возможность это сделать и как мне нужно это сделать, пока я не получу подсказку здесь.

Ответ №2:

Насколько я знаю, вы можете поместить предложение HAVING в параметр group:

 $usersInfo = $dataMapper->find([],["group"=>"id HAVING weighted_score<2"]);
  

Другим способом может быть создание представления в mysql и фильтрация записей по виртуальным полям в этом представлении.

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

1. Я был уверен, что попробовал это (после того, как я посмотрел на код библиотеки и заметил регулярное выражение, которое включает having предложение), но у меня это не сработало. Я перепроверю и дам вам знать

2. Похоже, не работает. И журнал базы данных не показывает разницы между запросом, выполняемым с предложением и без having предложения.

3. Похоже, эта функция исчезла 1 год назад, и никто не заметил ^^ github.com/bcosca/fatfree-core/commit /…

4. Исправлено в github.com/bcosca/fatfree-core/commit /…

5. Спасибо ^^ Я попробую