1. Выборку по таблице tbl_publication можно вынести в подзапрос. Тогда её можно сразу ограничить 12 записями и делать JOIN по небольшому набору. Заодно можно избавиться от группировки, тем более, что в строгом SQL она неправильная.
2. Учитывая, что используется LEFT JOIN с условием
tbl_publications_media.media_type = 3
, условие
(tbl_publications_media.media_type IS NULL OR tbl_publications_media.media_type = 3)
будет истинным всегда, от него можно избавиться.
SELECT `p`.`id`, `p`.`name`, `p`.`content`, `p`.`create_time`,
`p`.`type`, `p`.`section_id`, `m`.`media_url`
FROM (
SELECT `id`, `name`, `content`, `create_time`, `type`, `section_id`
FROM `tbl_publication`
WHERE `article` = 0 AND `status` = 1 AND `type` = 0
ORDER BY `p`.`id` DESC
LIMIT 12
) AS `p`
LEFT JOIN `tbl_publications_media` AS `m`
ON `m`.`publication_id` = `p`.`id`
AND `m`.`media_type` = 3
P.S. Про группировку:
Представьте, что с одной строкой из tbl_publications связались две разные строки из tbl_publications_media. Какая из них должна попасть в группу и почему?