我有一个mysql查询(演变两个表:Users
和Files
),这让我头疼:
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(尽管我认为这里并不重要......
GROUP BY
子句的情况下,COUNT()
聚合将只返回一行,MySQL对GROUP BY
的存在或内容很宽容(在大多数其他RDBMS中,您的查询会因语法错误而失败)。
由于您有多个列,因此您应该针对子查询进行联接以获取每个Files.GUID
的计数。 尽管MySQL将允许您在没有子查询的情况下GROUP BY Users.GUID
,这更简单,但您可能无法从Users.Name
或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
按用户分组,否则它将全部折叠为一行: GROUP BY Users.GUID
<</p>
,该子查询分别计算每个GUID
的文件总Count
。
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'