3

私はこのmysqlクエリ( 2つのテーブルを進化させる: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クエリにファイル数とともにユーザーの基本情報を返すようにするにはどうすればよいですか?

ところで、私はPHP5でCodeIgniter2を使用しています(ただし、ここでは重要ではないと思います...)

4

3 に答える 3

4

句がない場合、COUNT()アグリゲートは1行のみを返し、MySQLは(他のほとんどのRDBMSでは構文エラーでクエリが失敗する) GROUP BYの存在または内容について寛容です。GROUP BY

複数の列があるため、サブクエリに対して結合して、あたりのカウントを取得する必要があります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
于 2012-10-16T01:12:06.747 に答える
3

ユーザーごとにグループ化する必要があります。そうしないと、すべてが1つの行に折りたたまれます。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 に答える