#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. Спасибо ^^ Я попробую