3

我有这个 mysql 查询(演变两个表UsersFiles),这让我很头疼:

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 查询返回用户基本信息以及文件数?

顺便说一句,我将 CodeIgniter 2 与 PHP 5 一起使用(尽管我认为这并不重要......)

4

3 回答 3

4

如果COUNT()没有子句,聚合将只返回一行GROUP BY,并且 MySQL 对 的存在或内容很宽容GROUP BY(在大多数其他 RDBMS 中,您的查询会因语法错误而失败)。

由于您有多个列,因此您应该加入一个子查询以获取每个Files.GUID. 尽管 MySQL 允许您GROUP BY Users.GUID不使用更简单的子查询,但您可能无法从Users.Nameor中获得您期望的结果Users.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
于 2012-10-16T01:12:06.747 回答
3

您需要按用户分组,否则它将全部折叠为一行:GROUP BY Users.GUID

于 2012-10-16T01:12:44.903 回答
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'
于 2012-10-16T01:12:11.907 回答