2. Поидеи как-то так.
SELECT id, name FROM category WHERE id in (Select parent_category_id FROM category GROUP BY parent_category_id HAVING count(*) <=3)
Этот запрос не выберет категории, которые ввобще не имеют детей. Тоисть выберет те которые имеют от 1 до 3 дочерних категорий.
3. Как-то так
SELECT category.id, category.name FROM category LEFT JOIN category as ct ON category.id = ct.parent_category_id WHERE ct.parent_category_id is NUll AND category.parent_category_id <> 0
Код не проверял но думаю идея понятна.