Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос / 7 сообщений из 7, страница 1 из 1
20.01.2007, 16:15
    #34269906
webonata
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос
Помогите, пожалуйста, с запросом.

Задача такая.

Есть таблица groups c полями (gid; gname).
Значения:
(1;имя1)
(2;имя2)
(3;имя3)
....

Есть таблица codes c полями (cid; cname).
Значения:
(1;код1)
(2;код2)
(3;код3)

Есть таблица group_to_code с полями (gid; cid и другими).
Значения:
(1,1,...)
(1,1,...)
(1,1,...)
(1,2,...)
(2,1,...)
(2,2,...)
(2,2,...)
(2,3,...)
(2,3,...)

Как наиболее правильно выбрать из таблицы groups записи в порядке убывания количества уникальных кодов, с которыми они хранятся в таблице group_to_code ?
В каждой записи нужно получить gid, gname, кол-во уникальных кодов с ней связанных, по которому собственно сортировка и осуществляется...

То есть в вышеописанном примере значений на первом месте должна быть группа 2, т.к. она встречается в таблице group_to_code с 3 уникальными кодами; затем группа 1 с двумя уникальными кодами.

Спасибо.
...
Рейтинг: 0 / 0
20.01.2007, 22:17
    #34270150
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос
webonataПомогите, пожалуйста, с запросом.
То есть в вышеописанном примере значений на первом месте должна быть группа 2, т.к. она встречается в таблице group_to_code с 3 уникальными кодами; затем группа 1 с двумя уникальными кодами.

Спасибо.

Za optimalnost' ne ruchaus'. No mojno tak:
Код: plaintext
1.
select gid,min(gname),count(*) from (select distinct on (g.gid,cid) g.gid, gname, cid from groups as g left join group_to_code as gc on g.gid=gc.gid) as x  group by gid  order by count(*) desc;
...
Рейтинг: 0 / 0
22.01.2007, 05:35
    #34270971
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос
2 Автор:
Вот так попробуй:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select groups.gid,
       groups.gname,
       count(codes.cname) total_cod,
       count(distinct codes.cname) unique_cod
  from groups
  left outer join
       group_to_code
    on group_to_code.gid = groups.gid
  left outer join 
       codes
    on group_to_code.cid = codes.cid
 group by 
       groups.gid,
       groups.gname
 order by 
       unique_cod desc

Query finished, retrieving results...

GID   GNAME   TOTAL_COD   UNIQUE_COD
---   -----   ---------   ----------
   2    имя2             5              3 
   1    имя1             4              2 
   3    имя3             0              0 

 3  row(s) retrieved


З.Ы.
Если ситуация, когда один и тот же codes.cname занесен несколько раз под разными codes.cid не допускается, то из запроса можно выкинуть обращение к таблице codes, переписав его вот в таком виде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select groups.gid,
       groups.gname,
       count(group_to_code.cid) total_cod,
       count(distinct group_to_code.cid) unique_cod
  from groups
  left outer join
       group_to_code
    on group_to_code.gid = groups.gid
 group by 
       groups.gid,
       groups.gname
 order by 
       unique_cod desc

Query finished, retrieving results...

GID   GNAME   TOTAL_COD   UNIQUE_COD
---   -----   ---------   ----------
   2    имя2             5              3 
   1    имя1             4              2 
   3    имя3             0              0 

 3  row(s) retrieved
...
Рейтинг: 0 / 0
22.01.2007, 05:40
    #34270972
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос
СергейК webonataПомогите, пожалуйста, с запросом.
То есть в вышеописанном примере значений на первом месте должна быть группа 2, т.к. она встречается в таблице group_to_code с 3 уникальными кодами; затем группа 1 с двумя уникальными кодами.

Спасибо.

Za optimalnost' ne ruchaus'. No mojno tak:
Код: plaintext
1.
select gid,min(gname),count(*) from (select distinct on (g.gid,cid) g.gid, gname, cid from groups as g left join group_to_code as gc on g.gid=gc.gid) as x  group by gid  order by count(*) desc;
У тебя зарпос неверный. Ведь он для gid = 3 вернет некорректный результат. Нет в таблице group_to_code записей с gid = 3, а твой запрос показывает что есть одна запись ;)
...
Рейтинг: 0 / 0
22.01.2007, 07:52
    #34271026
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос
Бабичев СергейУ тебя зарпос неверный. Ведь он для gid = 3 вернет некорректный результат. Нет в таблице group_to_code записей с gid = 3, а твой запрос показывает что есть одна запись ;)

Ty prav, no reshaetsia eto prosto -- zamenoi count(*) na count(cid) :) :

Код: plaintext
1.
2.
3.
select gid,min(gname),count(cid) from
      (select distinct on (g.gid,cid) g.gid, gname, cid from groups as g left join group_to_code as gc on g.gid=gc.gid)
       as x group by gid  order by count(cid) desc;
...
Рейтинг: 0 / 0
22.01.2007, 08:00
    #34271032
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос
to Бабичев Сергей

Vinovat, zametil, chto ia napisal to je chto i ty v postscriptume ... (tolko s zamenoi dopolnitelnoi gruppirovki na min()).
...
Рейтинг: 0 / 0
23.01.2007, 01:00
    #34273744
webonata
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос
Всем спасибо за подсказки! :)
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]