2014-12-03 40 views
0

我想要獲取組中某個目錄中包含的文件大小的總和。 但是,由於從聯接返回的行數,大小正在倍增。我的查詢中還包含其他表以獲取歷史信息。我有一個PostgreSQL數據庫,我在我的存儲庫接口中使用了一個hibernate查詢。Hibernate中使用多個連接的不同總和

在線,它說我需要子查詢我的聚合。不過,我需要加入所有這些表格才能獲得與用戶相關的目錄相關的文件。我怎樣才能做出明顯的總和?表之間

@Query(value = "select a.username as name, sum(d.filesize) as size" 
     + "from usergroup a " 
     + "join a.nuser b " 
     + "join b.directory c " 
     + "join c.files d " 
     + "join b.nuserhistory e" 
     + "group by a.name" 
     + "having count(e) > b.maxCount") 

關係:

  • 許多用戶組許多nusers。
  • 許多導演對一個nuser。
  • 許多文件到一個目錄。
  • 許多歷史對一個nuser。
+0

什麼是'join.b.history e'?看起來像一個錯字。此外,所有連接條件都缺失,'group'和'user'是保留字,不能用作不引號的標識符。請提供有效的語法來處理。 – 2014-12-03 17:48:15

+0

對不起,我試圖簡化我的查詢的語法,以更清楚地顯示我遇到的問題,我也必須更改一些模型名稱。 – Sarah92 2014-12-03 17:59:59

+0

加入條件仍然缺失。這些對於答案是必不可少的。此外,人們必須知道你的關係設計(表格定義),以瞭解乘法發生的位置。這裏有一個解釋相關的答案:http://stackoverflow.com/questions/12464037/two-sql-left-joins-produce-incorrect-result/12464135#12464135 – 2014-12-03 18:34:19

回答

0

你的基本問題似乎是,在加盟nuserhistory(N每用戶行)乘以行,從而導致不正確的值count()sum()

每個用戶的聚合(計數)行數之前加入子查詢。相應地將HAVING條件轉換爲WHERE條件。 SQL可能是這個樣子:

SELECT a.username AS name -- "username" comes from table "usergroup"?? 
    , sum(c.filesize) AS size 
FROM usergroup g 
JOIN a.nuser  a ON ??? -- join conditions unknown 
JOIN b.directory b ON ??? 
JOIN c.files  c ON ??? 
JOIN (
    SELECT user_id, count(*) AS ct 
    FROM b.nuserhistory 
    GROUP BY user_id  -- assuming user_id as foreign key column 
    ) d ON d.user_id = a.id 
WHERE d.ct > a.maxCount -- mixed case name without double quotes? 
GROUP BY a.username;  -- cannot be "a.name" 

這主要是猜測,因爲你沒有透露你的關係模型和你目前尚查詢不積少成多。

相關問題