If this is MySQL:
SELECT q.ID,
q.Description,
GROUP_CONCAT(DISTINCT c.name) AS countries,
GROUP_CONCAT(DISTINCT r.name) AS regions
FROM Questions q
INNER JOIN Locations l
ON l.question_id = q.id
LEFT JOIN Countries c
ON c.id = country_or_region_id
AND l.type = 'country'
LEFT JOIN Regions R
ON R.id = country_or_region_id
AND l.type = 'region'
GROUP BY q.ID, q.Description;
If this is SQL- Server:
SELECT q.ID,
q.Description,
countries = STUFF(( SELECT ', ' + c.name
FROM Locations l
INNER JOIN Countries c
ON c.id = country_or_region_id
AND l.type = 'country'
WHERE l.question_id = q.id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 2, ''),
regions = STUFF(( SELECT ', ' + r.name
FROM Locations l
INNER JOIN Regions r
ON r.id = country_or_region_id
AND l.type = 'region'
WHERE l.question_id = q.id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
FROM Questions q;