2016-09-30 59 views
0

有沒有辦法將MySQL的HAVING子句與Fat Free Framework's SQL Mapper object's方法中的任何一個一起使用?假設我有以下數據表:缺少在F3中使用SQL的HAVING子句的選項

+----+-------+--------+ 
| 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: 我知道該怎麼做,如果有(基於manual)爲HAVING條款不支持的方式:

$databaseObject = new DB\SQL(...); 
$dataMapper = new \DB\SQL\Mapper($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 DB\SQL(...); 
$dataMapper = new \DB\SQL\Mapper($databaseObject, "tableName"); 
$dataMapper->weightedScore = "SUM(weight*score)/SUM(weight)"; 
$usersInfo = $dataMapper->find([],["group"=>"id", "having"=>"weighted_score<2"]); // rough idea 
$place = count($usersInfo); 

如果count method支持$options它會更簡單,它WOU ld保存應用程序使用的內存,因爲不會加載任何記錄:

$databaseObject = new DB\SQL(...); 
$dataMapper = new \DB\SQL\Mapper($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; 

希望它會有所幫助。

+0

是的,但這仍然是普通的香草SQL。我想知道的是,如果可以使用Fat Free Framework的SQL映射器來完成。它擴展了PHP PDO,所以也許有辦法在PDO層面上做到這一點......我將用一個我希望能夠完成的例子以及我如何做到這一點的示例來更新我的問題,直到我將在這裏得到一個提示。 – george007

1

據我所知,你可以把HAVING子句入組選項:

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

另一種方式可能是在MySQL中創建一個視圖,在該視圖中的虛擬域篩選記錄。

+0

我很確定我試過了(在我查看了庫的代碼後,注意到包含'having'子句的正則表達式),但它不適用於我。我會仔細檢查並讓你知道 – george007

+0

似乎沒有工作。和DB [日誌](https://fatfreeframework.com/sql#log)顯示查詢運行有和沒有'擁有'條款之間沒有區別。 – george007

+1

看起來這個功能已經在1年前消失了,沒有人注意到^^ https://github.com/bcosca/fatfree-core/commit/4b3faa056ebd67c866ddf2dc6c70da01b73095fd – xfra35