2009-02-28 25 views
24

私は 'フォルダ'のテーブルを持っています。私はuserIdが16のすべてのレコードを返したいと思います。ジョインとカウントを組み合わせたMySQLステートメント?

SELECT * FROM `folders` WHERE userId = 16; 

私は 'ファイル'のテーブルを持っています。上に返された各「フォルダ」について、その「フォルダ」内の「ファイル」の数を返したいとします。

SELECT COUNT(*) as "Files" FROM files WHERE Folder = n; 

これをどのように組み合わせますか?道に迷いました。ありがとう!その後、最初に をそれに参加、

SELECT 
    folders.*, 
    COUNT(files.*) as filetotal 
FROM folders 
    LEFT JOIN files ON folders.ID=files.folderID 
WHERE userId = 16 
GROUP BY folders.ID 

答えて

13

はおそらくIDまたはそのようなことでGROUP BYとグループにそれを使用する必要がありますこのようなクエリ:

select 
     f.* 
     fc.Files 
    from 
     Folders f 
-- 
     -- Join the sub query with the counts by folder  
     JOIN (select 
       Folder, 
       count(*) Files 
      from 
       files 
      group by 
       Folder) as fc 
      on (fc.Folder = f.Folder) 
    where 
     f.userid = 16 
+1

これは間違っています。フォルダ。*で参照される列は、GROUP BY句になければなりません。 GROUP BYを使用するSELECT文のすべての列は、GROUP BYまたは集約関数のいずれかになければなりません。 – alyssackwan

+0

ええ、そういうわけで、私はfolders.ID(グループ化するには1列で十分です)でgrouppingしています。 – dusoft

+0

これを動作させるには、SELECT句に記載されている「フォルダー」から必要な列をすべてGROUP BYする必要があります。「1列でグループ化するだけで十分です」という理論をテストしました。少なくとも2005年。 –

4

がフォルダによってグループがフォルダごとにカウントを取得するには、サブクエリを実行します。

2
select 
    f.`folder`, 
    f.`userId`, 
    r.`count` 

from 
    `folders` f 
    left join 
    (
     select 
      `Folder`, 
      count(`id`) `count` 

     from `files` 

      group by `Folder` 
    ) r 
     on r.`Folder`=f.`folder` 

where 
    `userId`=16 



次の文でグループを使用しない場合。


私は別のテーブル内の製品の星の評価をカウントしたい製品リストでsimmilar問題[1-5]を持っていたし、その特定の製品のために投票したユーザーの量。