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

Posted

技术标签:

【中文标题】结合连接和计数的MySQL语句?【英文标题】:MySQL statement combining a join and a count? 【发布时间】:2010-10-10 13:06:58 【问题描述】:

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

SELECT * FROM `folders` WHERE userId = 16;

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

这是错误的。 folder.* 中引用的列必须在 GROUP BY 子句中。带有 GROUP BY 的 SELECT 语句中的所有列都必须在 GROUP BY 或聚合函数中。 是的,这就是我按folders.ID分组的原因(一列足以分组)。 要使其正常工作,您需要对 SELECT 子句中提到的“文件夹”中的所有必需列进行 GROUP BY - 我测试了“一列足以分组”的理论至少在 SQL Server 2005 中并非如此。 无论如何都不要使用 SELECT * 而是明确指定要返回的所有列。 他有 * 在他的原始查询中,我不知道他的桌子是什么样子,所以停止拖钓,用你的智慧去做一些有创意的事情。【参考方案2】:

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

    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】:
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

【讨论】:

【参考方案4】:
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] 中产品的星级以及投票支持该特定产品的用户数量。

【讨论】:

以上是关于结合连接和计数的MySQL语句?的主要内容,如果未能解决你的问题,请参考以下文章

带有内部连接和限制的mysql删除

mysql select as 语句结合查找和替换

MySQL SELECT 增量计数器

mysql update语句与limit的结合使用

MySQL Select 语句 - 两个表,按其他表的计数对一个表进行排序

如何将java程序里的一段连接mysql的语句转为连接sqlserver语句。连接的是sqlser