2012-10-16 97 views
3

,當我有這樣的MySQL查詢(演進兩個表UsersFiles)這是給我頭痛的事:MySQL的左連接的查詢只返回一行添加COUNT()MySQL的函數

SELECT Users.GUID, Users.Name, Users.CreationDate, Files.Date, 
    Count(Files.GUID) As FilesCount 
FROM Users 

    LEFT JOIN Files ON Users.GUID = Files.UserGUID 

WHERE Users.Group = '1' 

當我執行它,它總是返回1行(這不是我想要的)。但如果我刪除它:

Count(Files.Date) As FilesCount 

它正確返回所期望的所有行。

基本上,我需要獲得屬於用戶文件的數量(連同用戶信息)

我的問題是:我怎樣才能解決這個&使MySQL查詢返回用戶基本信息以及文件數量?

順便說一句,我使用的是笨2在PHP 5中(雖然我不認爲在這裏重要的...)

+1

嘗試添加'集團通過(Users.GUID)'Where子句後 –

回答

4

COUNT()總量將在沒有GROUP BY子句只返回一個排,和MySQL對GROUP BY的存在或內容持寬容態度(您的查詢在大多數其他RDBMS中會因語法錯誤而失敗)。

由於您有多個列,您應該聯合一個子查詢以獲得每Files.GUID的計數。雖然MySQL會允許你在沒有子查詢的情況下登錄到GROUP BY Users.GUID,但這可能會比較簡單,你可能無法從Users.NameUsers.CreationDate得到預期的結果。該方法是更便攜:

SELECT 
    Users.GUID, 
    Users.Name, 
    Users.CreationDate, 
    FileCount 
FROM 
    Users 
    /* Subquery returns UserGUID and associated file count */ 
    LEFT JOIN (
    SELECT UserGUID, COUNT(*) AS FileCount 
    FROM Files 
    GROUP BY UserGUID 
) fc ON Users.GUID = fc.UserGuid 
WHERE Users.Group = 1 
2

查詢具有子查詢,其分別計算文件的總Count每個GUID

SELECT Users.GUID, 
     Users.Name, 
     Users.CreationDate, 
     Files.Date, 
     c.FilesCount 
FROM Users 
     LEFT JOIN Files 
      ON Users.GUID = Files.UserGUID 
     LEFT JOIN 
     (
      SELECT UserGUID, Count(GUID) As FilesCount 
      FROM Files 
      GROUP BY UserGUID 
     ) c on c.UserGUID = Users.GUID 
-- WHERE Users.Group = '1' 
3

您需要的用戶組,否則摺疊所有以一行:GROUP BY Users.GUID