Проблема не в CASE, а в том, что вы условие в SELECT MAX... испортили, заменив Rates.currency на R.currency - ведь псевдоним R для таблицы Rates уже используется. В результате получается так: R.date должна быть равна максимальной среди тех, где выполнено условие I.currency = R.currency - а оно оказывается в данном случае всегда истинным, поскольку уже присутствует в первой части условия джоина - то есть, берётся просто максимальная дата. А значит, чтобы было что джоинить, I.currency должна соответствовать той, что содержится в Rates в записи с максимальной датой. Поэтому, если последним по дате задаётся курс доллара, то для евро ничего найдено не будет - отсюда и null.
Я вам вообще-то не какую-то "идею" сообщил, а вполне конкретный факт - не работает, потому что вызывается несуществующая функция. О чём ещё тут говорить?
Гм-гм... а почему бы вам не проверить этот код самому? Вдруг заработает как надо. А если не заработает, то вместо того, чтобы тут же бежать просить помощи, попытаться самому понять, что пошло не так?
Можно использовать не id, а любое другое поле из comments. Главное, чтобы у тех новостей, которые не имеют комментариев, count считать было нечего. Если написать просто *, то будет подсчитана та строка, которая достаётся из news, и для статей без комментов результат будет 1, а не 0.
Пусто значит... Давайте тогда посмотрим, как выглядит Form Data при отправке запроса - раз выражение в условном операторе в send.php оказывается ложным, значит name и/или email отсутствуют.
Так что непонятно, каким образом data попадает в resolve.