Если нужны новости, где ноль лайков:
SELECT `n`.`id`, IFNULL(`c`.`count`, 0)
FROM `news` AS `n`
LEFT JOIN (
SELECT `news_id`, COUNT(*) AS `count`
FROM `like`
WHERE `date` > date_sub(NOW(), INTERVAL 7 day)
GROUP BY `news_id`
) AS `c` ON `c`.`news_id` = `n`.`id`
ORDER BY `c`.`count` DESC
LIMIT 100
Если не нужны:
SELECT `news_id`, COUNT(*) AS `count`
FROM `like`
WHERE `date` > date_sub(NOW(), INTERVAL 7 day)
GROUP BY `news_id`
ORDER BY `count` DESC
LIMIT 100
Ну и индексы по `like`.`date` и `like`.`news_id`, возможно комбинированный индекс, надо EXPLAIN смотреть.