Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个表上的Mysql计数(*)_Sql_Mysql - Fatal编程技术网

多个表上的Mysql计数(*)

多个表上的Mysql计数(*),sql,mysql,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 换句话说,对于“课程”返回的所有记录,我如何做到这一点 另一个名为“modCount”的列显示该

此查询有什么问题:

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
换句话说,对于“课程”返回的所有记录,我如何做到这一点 另一个名为“modCount”的列显示该课程id的模块表中的记录数,另一个名为“vidCount”的列对视频表执行相同的操作

错误:

错误号码:1064


您的SQL语法有错误; 检查相应的手册 您的MySQL服务器版本 使用near'as的正确语法 moduleCount,vid.COUNT作为vidCount 从第1行的“作为co的课程”


使用子选择,您可以执行以下操作:

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
但是要小心,因为当课程有很多行时,这是一个昂贵的查询

编辑: 如果您的表非常大,那么下面的查询应该会执行得更好,以便更复杂地阅读和理解

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

拍这个。我用一些非mysql代码完成了这项工作:

function getAllWithStats($info='*',$order='',$id=0)
{
    $courses=$this->getAll($info,$order,$id);

    foreach ($courses as $k=>$v)
    {
        $courses[$k]['modCount']=$this->getModuleCount($v['id']);
        $courses[$k]['vidCount']=$this->getVideoCount($v['id']);
    }

    return $courses;
}

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

SELECT COUNT(*),(SELECT COUNT(*) FROM table2) FROM table1

费用是需要记住的一件重要事情,特别是对于几个子选择;查看与您的MySQL服务器版本对应的手册,了解要在第2行的“mod WHERE mod.course\u id=co.id as moduleCount,SELECT COUNT*”附近使用的正确语法。请再试一次。如果这不起作用,MySQL服务器就不支持标量子选择。你用哪个版本?我想我用的是mysql 5。我确实尝试过没有where,但仍然不起作用。MySQL 5应该可以。您正在运行ANSI模式吗?这与subselect解决方案基本相同。您将对courses表中的每一行执行两个额外的查询,如果courses表不是非常大,这不会有太大问题。查看subselect解决方案和PHP解决方案,可能会发现性能更好的解决方案很有趣。尽管PHP解决方案会有一些网络开销,因为数据必须在线路上传输,但subselect解决方案将因其subselect缺少MySQL查询缓存而受到影响-尽管完整的查询将缓存在查询缓存中。我刚刚注意到这一点,modcnt,lol.你可以在工作相关代码中使用“cnt”作为速记吗D
function getAllWithStats($info='*',$order='',$id=0)
{
    $courses=$this->getAll($info,$order,$id);

    foreach ($courses as $k=>$v)
    {
        $courses[$k]['modCount']=$this->getModuleCount($v['id']);
        $courses[$k]['vidCount']=$this->getVideoCount($v['id']);
    }

    return $courses;
}
SELECT COUNT(*),(SELECT COUNT(*) FROM table2) FROM table1