Mysql COUNT (*) на нескольких таблицах
Что не так с этим запросом:
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 для правильный синтаксис для использования рядом ') в качестве moduleCount, vid.COUNT() как vidCount FROM курсов как co, 'в строке 1
Ответы
Ответ 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
Но будьте осторожны, поскольку это дорогой запрос, когда курсы имеют много строк.
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
Ответ 2
У меня лучшее решение и легкое
SELECT COUNT(*),(SELECT COUNT(*) FROM table2) FROM table1
Ответ 3
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
Ответ 4
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
Ответ 5
Снимите это. Я выполнил эту работу с помощью некоторого не-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;
}