2015-01-20 3 views
0

У меня есть таблица countries коды стран и содержащие имена:Inner Присоединяйтесь от группы по

name   code 
FRANCE   FR 
JAPAN   JP 

и таблицу просмотра страницы статистики views:

page_id code   date etc... 
34   FR    2015-01-01 
34   FR    2015-01-02 
34   JP    2015-01-02 

я хотел бы, чтобы выводить список из всех стран, в которых эта страница была просмотрена, но с указанием названия страны, поэтому в результатах следует указать: FRANCE, JAPAN

Я могу легко получить список кодов стран t шляпа:

SELECT code FROM views WHERE page_id = 34 GROUP BY code; 

Но сопоставление их с именами в таблице стран - это жесткий бит. Есть идеи?

Я попытался это, но он не работает:

SELECT 
    countries.name as name_from_countries, 
FROM 
    countries 
INNER JOIN name_from_countries ON countries.code = views.code 
WHERE 
    views.page_id = 34 
GROUP BY 
    views.code 
+0

Существует ли конкретная СУБД, которую вы используете? –

+0

Я использую postgres/amazon redshift :) – LittleBobbyTables

ответ

2

Вам не нужно GROUP BY здесь. Просто используйте DISTINCT.

SELECT DISTINCT countries.name as name_from_countries 
FROM countries 
INNER JOIN views ON countries.code = views.code 
WHERE 
    views.page_id = 34 
+0

Это потрясающе, спасибо, что познакомил меня с «отличным»! Примут через минуту или две – LittleBobbyTables

1

Вам нужно добавить countries.name к вашему GROUP BY - Я предполагаю, что у вас есть некоторые агрегаты здесь:

SELECT v.code, c.name AS name_from_countries 
    FROM views v INNER JOIN countries c 
    ON v.code = c.code 
WHERE v.page_id = 34 
GROUP BY v.code, c.name; 

Если у вас нет каких-либо агрегатов (например, COUNT(*)), то вы можете получить список стран с по меньшей мере одним видом следующим образом:

SELECT c.code, c.name AS name_from_countries 
    FROM countries c 
WHERE EXISTS (SELECT 1 FROM views v 
       WHERE v.code = c.code 
        AND v.page_id = 34); 
Смежные вопросы