sql - Mysql COUNT(*) 在多个表上

标签 sql mysql

这个查询有什么问题:

SELECT co.*, mod.COUNT(*) as moduleCount, vid.COUNT(*) as vidCount 
 FROM courses as co, modules as mod, videos as vid 
 WHERE mod.course_id=co.id AND vid.course_id=co.id ORDER BY co.id DESC

换句话说,我该如何处理从“类(class)”返回的每条记录,有 一个名为“modCount”的附加列显示模块表中该 course_id 的记录数,另一个名为“vidCount”的列对视频表执行相同的操作。

错误:

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') as moduleCount, vid.COUNT() as vidCount FROM courses as co, ' at line 1

最佳答案

使用子选择你可以:

SELECT co.*, 
    (SELECT COUNT(*) FROM modules mod WHERE mod.course_id=co.id) AS moduleCount, 
    (SELECT COUNT(*) FROM videos vid WHERE vid.course_id=co.id) AS vidCount
FROM courses AS co
ORDER BY co.id DESC

但要小心,因为当类(class)有很多行时,这是一个昂贵的查询。

编辑: 如果您的表非常大,则以下查询应该执行得更好(有利于阅读和理解更复杂)。

SELECT co.*, 
    COALESCE(mod.moduleCount,0) AS moduleCount,
    COALESCE(vid.vidCount,0) AS vidCount
FROM courses AS co
    LEFT JOIN (
            SELECT COUNT(*) AS moduleCount, course_id AS courseId 
            FROM modules
            GROUP BY course_id
        ) AS mod
        ON mod.courseId = co.id
    LEFT JOIN (
            SELECT COUNT(*) AS vidCount, course_id AS courseId 
            FROM videos
            GROUP BY course_id
        ) AS vid
        ON vid.courseId = co.id
ORDER BY co.id DESC

关于sql - Mysql COUNT(*) 在多个表上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/944099/

相关文章:

php - 用需要相互引用的记录填充两个表的最佳方法是什么?

php - 计算 php 数组内的特定值

php - 显示 foreach 循环的总和

c# - 在 C# 中读取 oledbdatareader 中的第 n 行

mysql - 选择一个类别中的所有书籍,但属于其他类别的书籍除外

sql - Postgres 从一个表到多个表选择单个表行

mysql - 团队总数/mysql

sql - SQL Server 代码之间的区别?

mysql - 过滤mysql中的别名

php - Last_insert_id 的效率如何?