2012-09-17 68 views
4

我不能在標題部分更具體,但我想爲我做一些有點複雜的事情。我以爲我做到了,但事實證明它是越野車。涉及羣組和連接的SQL查詢

我有三個表如下:

ProjectTable

  • idProject
  • 標題
  • idOwner

OfferTable

  • idOffer
  • idProject
  • idAccount

AccountTable

  • idAccount
  • 用戶名

現在在一個查詢我的目標是列出所有制造最優惠項目,並在查詢中我也想得到詳細說明像是所有者的用戶名,提供者的用戶名*等等。所以我不必再爲每個項目查詢。

這是我的破碎的查詢,這是我第一次使用GROUP BY的實驗,我可能並不完全瞭解它。

SELECT Project.addDate,Project.idOwner ,Account.Username,Project.idProject, 
    Project.Price,COUNT(Project.idProject) as offercount 
FROM Project 
INNER JOIN Offer 
    ON Project.idProject= Offer.idProject 
INNER JOIN Account 
ON Account.idAccount = Project.idOwner 
GROUP BY Project.addDate,Project.idOwner, 
    Account.Username,Project.idProject,Project.Price 
ORDER BY addDate DESC 

*:我寫了想也沒想我只是想拿出例如額外的信息,這是毫無意義的感謝胡沙姆阿里。

回答

7

試試這個(修改後爲沒有報價的項目):

SELECT 
    Project.addDate, 
    Project.idOwner, 
    Account.Username, 
    Project.idProject, 
    Project.Price, 
    ISNULL(q.offercount, 0) AS offercount 
FROM 
    (
    SELECT 
     o.idProject, 
     COUNT(o.idProject) as offercount 
    FROM Offer o 
    GROUP BY o.idProject 
) AS q 
    RIGHT JOIN Project ON Project.idProject = q.idProject 
    INNER JOIN Account ON Account.idAccount = Project.idOwner 
ORDER BY addDate DESC 
+0

爲清楚起見,我寧願'COUNT (o.idOffer)',因爲我們實際上是在計算優惠,而不是項目。 –

+0

@HosamAly,聽起來很公平。 –

+0

此查詢是否返回具有0個優惠的項目?我改變了這個以適合我的實際表名,但我不確定我是否犯了一個錯誤,或者這個查詢沒有顯示它們。 我將最後兩個連接類型更改爲'FULL和LEFT',現在當它爲零時我得到NULL。這不是一個問題,並且很容易用代碼修復,但我想知道如何將這些NULL設置爲零來改變。 – EralpB

1

我可能會略有切換查詢到這一點:

select p.addDate, 
    p.idOwner, 
    a.Username, 
    p.idProject, 
    p.price, 
    o.OfferCount 
from project p 
left join 
(
    select count(*) OfferCount, idproject 
    from offer 
    group by idproject 
) o 
    on p.idproject = o.idproject 
left join account a 
    on p.idowner = a.idaccount 

這樣,你通過projectid,而不是基於所有你通過分組等領域得到count。如果projectid或其他ID不存在於其他表中,我也會使用LEFT JOIN,但您仍然會返回數據。

1

你的問題是有點模糊,但這裏有一些指針:

  • 要列出項目「以使大多數報價「,ORDER BY offercount
  • 您實質上是在查詢項目,所以您應該在GROUP BY Project.idProject之前先將其他字段。
  • 您正在查詢每個項目提供的優惠數量,但您詢問優惠詳情。要求將這兩個信息組合在一起並沒有什麼意義(語法方面)。如果您想要獲得所有優惠的總數,並在結果的每條記錄中重複,並附上優惠信息,則必須使用內部查詢。

的內部查詢,可無論在FROM子句中,由其他答案建議,或直接在SELECT子句中,像這樣:

SELECT Project.idProject, 
     (SELECT COUNT(Offer.idOffer) 
      FROM Offer 
     WHERE Offer.idProject = Project.idProject 
     ) AS OfferCount 
    FROM Project 
+0

是的,你對第一點是正確的,我有3種不同類型的訂購查詢,我複製了錯誤的一種。我糾正了第三點。 – EralpB