Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / связь многие ко многим / 6 сообщений из 6, страница 1 из 1
24.09.2008, 19:50
    #35558054
daenlou
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь многие ко многим
Добрый день. Помогите победить задумку.

Есть две таблицы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Table1
id
title

данные:
 1 |Название

Table2
id
name

данные:
 1 |осень
 2 |весна

Table3
table1_id
table2_id

данные:
 1 | 1 
 1 | 2 

Хочется получить результат вида
Код: plaintext
|Название|осень весна|
делать подзапрос для каждой строки Table1 не хочется так как выбираются по 20 записей из Table1 и для каждой надо взять объеденится с Table2

версия Postgresql 8.1.11 но могу поставить 8.3

Спасибо.
...
Рейтинг: 0 / 0
24.09.2008, 21:41
    #35558171
Sishnikov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь многие ко многим
Ну, как идея: попробовать самому написать агрегатную функцию concat(text), а потом SQL:
SELECT title, concat(name)
FROM Table1, Table2, Table3
WHERE table1_id = Table1.id and table2_id = Table2.id
GROUP BY Table1.id
...
Рейтинг: 0 / 0
24.09.2008, 22:05
    #35558189
Sishnikov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь многие ко многим
вроде как-то так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION concat_sfunc3(state text, "next" text)
  RETURNS text AS
E'SELECT $1 || \' \' || $2;'
  LANGUAGE 'sql' VOLATILE
  COST  1 ;

CREATE OR REPLACE FUNCTION concat_ffunc(state text)
  RETURNS text AS
'SELECT $1;'
  LANGUAGE 'sql' VOLATILE
  COST  1 ;

CREATE AGGREGATE concat(text) (
  SFUNC=concat_sfunc,
  STYPE=text,
  INITCOND='',
  FINALFUNC=concat_ffunc
);
...
Рейтинг: 0 / 0
24.09.2008, 22:06
    #35558190
Sishnikov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь многие ко многим
заменить: concat_sfunc3 на concat_sfunc =)
...
Рейтинг: 0 / 0
24.09.2008, 22:11
    #35558193
daenlou
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь многие ко многим
спасибо за ответ, к сожалению напоролся на собственную безолаберность. Дал не верные входные данные.

Создал агрегатную функцию

Код: plaintext
1.
2.
3.
4.
CREATE AGGREGATE "public"."concat" ( 
BASETYPE = "text",
SFUNC = "textcat",
STYPE = "text"
);


запрос
Код: plaintext
1.
2.
3.
select * from rdb_releases, rdb_people, rdb_artist
where  rdb_releases.id = rdb_artist.id_release
and    rdb_people.id = rdb_artist.id_people

возвращает
Код: plaintext
1.
2.
3.
id	id_label	catalogue	title	format	year	id_1	name	id_release	id_people
 3 	 1 	EAST01	Uptown / After Dark	"12"""	 1996 	 1 	A-Sides		 3 	 1 
 3 	 1 	EAST01	Uptown / After Dark	"12"""	 1996 	 2 	Coll Hand Flex	 3 	 2 

если select id, concat(name ', ') то группировка получается. Если перечисляю нужные мне дополнительные поля то получаю отлуп.

Код: plaintext
ERROR:  колонка "такаято" должна фигурировать в выражении GROUP BY или использоваться в агрегатной функции
...
Рейтинг: 0 / 0
25.09.2008, 00:49
    #35558311
daenlou
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
связь многие ко многим
все нашел и разобрался.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select rdb_releases.id, rdb_releases.catalogue,


array_to_string (
Array(
	select name from rdb_people tp where id IN (
		select rdb_artist.id_people from rdb_artist where rdb_artist.id_release = rdb_releases.id
		)
	), ', '
) as artist,

rdb_releases.title, rdb_releases.format, rdb_releases."year"

from rdb_releases
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / связь многие ко многим / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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