Mysql COUNT (*) для нескольких таблиц - PullRequest
15 голосов
/ 03 июня 2009

Что не так с этим запросом:

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', который показывает количество записей в таблице модулей для этого course_id, и другой столбец с именем 'vidCount', который делает то же самое для таблицы видео.

Ошибка:

Номер ошибки: 1064

У вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует ваша версия сервера MySQL для правильный синтаксис для использования рядом с ') как moduleCount, vid.COUNT () как vidCount ИЗ курсов как co, 'в строке 1

Ответы [ 5 ]

46 голосов
/ 03 июня 2009

С помощью подвыборов вы можете сделать:

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

Но будьте осторожны, так как это дорогой запрос, когда в курсах много строк.

EDIT: Если ваши таблицы довольно большие, следующий запрос должен работать намного лучше (в пользу того, чтобы его было сложнее читать и понимать).

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
12 голосов
/ 20 октября 2011

У меня есть лучшее решение и легко

SELECT COUNT(*),(SELECT COUNT(*) FROM table2) FROM table1
3 голосов
/ 03 июня 2009
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
1 голос
/ 03 июня 2009
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
0 голосов
/ 03 июня 2009

Снимай это. Я сделал работу с не-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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...