web-dev-qa-db-ja.com

結合とカウントを組み合わせたMySQLステートメント?

「フォルダ」のテーブルがあります。 userIdが16のすべてのレコードを返したいのですが。

SELECT * FROM `folders` WHERE userId = 16;

「ファイル」の表を持っています。上記で返された各「フォルダー」について、その「フォルダー」内の「ファイル」の数を返したいのですが。

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

これらを組み合わせるにはどうすればよいですか?道に迷いました。ありがとう!

26
Corey
SELECT  fol.*
 ,      (       SELECT  COUNT(*)
                FROM    files           fil
                WHERE   fil.Folder      = fol.Folder
        )       AS      "Files"
FROM    folders         fol
WHERE   fol.userId      = 16

これは相関サブクエリと呼ばれます。

http://dev.mysql.com/doc/refman/5.1/en/correlated-subqueries.html

52
jennykwan

おそらく、GROUP BYを使用して、IDなどでグループ化する必要があります。

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

フォルダごとにグループ化するサブクエリを実行してフォルダごとの数を取得し、次のように最初のクエリに結合します。

    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
4
Ron Savage
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



group byステートメントを使用しない場合。


製品リストに同様の問題があり、別の表[1-5]にある製品の星評価と、その特定の製品に投票したユーザーの数を数えたかった。

2
vortex