powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос
7 сообщений из 7, страница 1 из 1
Помогите составить запрос
    #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
Помогите составить запрос
    #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
Помогите составить запрос
    #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
Помогите составить запрос
    #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
Помогите составить запрос
    #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
Помогите составить запрос
    #34271032
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Бабичев Сергей

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


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