多个表上的Mysql COUNT(*)

Cli*_*ote 15 mysql sql

这个查询出了什么问题:

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
Run Code Online (Sandbox Code Playgroud)

换句话说,我怎么能这样做,从'courses'返回的每个记录,还有一个名为'modCount'的列,它显示了该course_id的modules表中的记录数,另一个名为'vidCount',用于执行视频表同样的事情.

错误:

错误号码:1064

您的SQL语法有错误; 查看与您的MySQL服务器版本对应的手册,以便在' )附近使用正确的语法作为moduleCount,vid.COUNT()作为vidCount FROM course as co,'在第1行

Ste*_*rig 46

使用子选择,您可以:

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
Run Code Online (Sandbox Code Playgroud)

但要小心,因为当课程有很多行时,这是一个昂贵的查询.

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

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
Run Code Online (Sandbox Code Playgroud)


小智 12

我有更好的解决方案和简单

SELECT COUNT(*),(SELECT COUNT(*) FROM table2) FROM table1
Run Code Online (Sandbox Code Playgroud)