结合连接和计数的MySQL语句?

时间:2009-02-28 17:33:25

标签: sql join count

我有一个'文件夹'表。我想返回userId为16的所有记录。

SELECT * FROM `folders` WHERE userId = 16;

我有一张'文件'表。对于上面返回的每个“文件夹”,我想在该“文件夹”中返回“文件”计数。

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

我如何结合这些?我迷路了。谢谢!

4 个答案:

答案 0 :(得分:52)

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

答案 1 :(得分:15)

您可能需要使用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

答案 2 :(得分:4)

执行按文件夹分组的子查询以获取每个文件夹的计数,然后加入它 像这样的第一个查询:

    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

答案 3 :(得分: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



如果您不想使用group by语句。


我在产品列表中遇到了类似的问题,我想在另一个表[1-5]中计算产品的星级评分以及投票支持该特定产品的用户数量。