1. Вы приводите кусок кода, хотя вопрос касается только одной строки
$category_id = mysql_result(mysql_query("SELECT `category_id` FROM `categories` WHERE `name` = '{$_GET['filter']}'"),0);
Остальная часть кода вообще не имеет отношения к вопросу к тому, же там содержатся ошибки. Например, если придет filter=2, то сработает первый if и до проверки
elseif(strlen($_GET['filter']) == 2)
вообще дело не дойдет, хотя по логике как раз именно эта ветка условия должна обрабатываться при значении 2.
К тому же, если уже проверили что $_GET['filter']) == 2, зачем писать
$filter = "AND `country` = '" . $_GET['filter'] . "'";
Пишите уже сразу
$filter = "AND `country` = 2";
Хм, тоже отошел от темы вопроса :)
2. По теме вопроса.
Распарсите свой filter
Например,
$arr = explode('-', $_GET['filter']);
Вы получите массив слов
А дальше делать с этим массивом то, что вам уже нужно.
Например,
$names = explode("' , '", $arr);
mysql_query("SELECT `category_id` FROM `categories` WHERE `name` IN ('$names')")
3. Использовать mysql_query, mysql_result уже считается дурным тоном.
Это очень устаревшие подходы, и уже не работают в современных версиях PHP.
Используйте современные подходы программирования, а не исправляйте код, который был написан 15 лет назад.