簡體   English   中英

多個表上的MySQL COUNT(*)

[英]Mysql COUNT(*) on multiple tables

此查詢有什么問題:

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服務器版本相對應的手冊以獲取正確的語法,以在第1行附近將' )用作moduleCount,將vid.COUNT( )用作vidCount FROM course as 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

我有更好的解決方案,容易

SELECT COUNT(*),(SELECT COUNT(*) FROM table2) FROM table1
SELECT co.*,
       (
       SELECT  COUNT(*)
       FROM    modules mod
       WHERE   mod.course_id = co.id
       ) AS modCount,
       (
       SELECT  COUNT(*)
       FROM    videos vid
       WHERE   vid.course_id = co.id
       ) AS vidCount
FROM   courses co
ORDER BY
        co.id DESC
SELECT co.*, m.ModCnt as moduleCount, v.VidCnt as vidCount 
FROM courses co
INNER JOIN (
        select count(*) AS ModCnt, co.id AS CoID
        from modules 
        group by co) m
    ON m.CoID = co.id
INNER JOIN (
        select count(*) AS VidCnt, co.id AS CoID
        from videos
        group by co) v
    ON v.CoID = co.id   
INNER JOIN videos vid 
    ON vid.course_id = 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM