Пользователь должен иметь возможность динамически создавать таблицы для отчетов.
Т.е. есть список неких атрибутов\значений(им же созданных), из которых пользователь может указать: значения вот этого и этого и этого атрибута, вывести мне таблицей в вот таком-то порядке колонок.
Таблицы:
=========================================================
Таблица где хранится id таблицы, и колонки к ней относящиеся(attr_id) и их позиция в таблице
COLUMN_NAME DATA_TYPE NULLABLE DATA_DEFAULT COLUMN_ID COMMENTS
ID-----------------NUMBER--------- No-----------------------------1-------------------------------
TABLE_ID--------NUMBER----------No-----------------------------2-------------------------------
ATTR_ID---------NUMBER----------No-----------------------------3--------------------------------
POSITION-------NUMBER(5,0)----Yes-----------------------------4
==========================================================
или так, если кому удобнее:
CREATE TABLE "ADMIN"."KF_TABLE_COLUMNS"
(
"ID" NUMBER NOT NULL ENABLE,
"TABLE_ID" NUMBER NOT NULL ENABLE,
"ATTR_ID" NUMBER NOT NULL ENABLE,
"POSITION" NUMBER(5,0)
)
===========================================================
И вторая, где хранится собственно список атрибутов, к-е могут быть сгруппированы как угодно для таблицы, где TABLE_ID ид таблицы, ROW_ID - номер строки в таблице в которой это значение, attr_id = id колонки, obj_id = объект для которого брать атрибуты.. Ну т.е. весь запрос должен быть выполнен для where obj_id = N;
===========================================================
COLUMN_NAME DATA_TYPE NULLABLE DATA_DEFAULT COLUMN_ID COMMENTS
TABLE_ID--------NUMBER(16,0)---No-----------------------------1--------------------------------
ROW_ID----------NUMBER(16,0)---No----------------------------2---------------------------------
ITEM_VALUE-VARCHAR2(200 BYTE)-Yes-------------------------3---------------------------------
ATTR_ID--------- NUMBER(16,0)-- Yes----------------------------4---------------------------------
OBJ_ID---------- NUMBER(16,0)---Yes--------------------------- 5---------------------------------
===========================================================
CREATE TABLE "ADMIN"."KF_TABLE_ATTR_VALUE"
(
"TABLE_ID" NUMBER(16,0) NOT NULL ENABLE,
"ROW_ID" NUMBER NOT NULL ENABLE,
"ITEM_VALUE" VARCHAR2(200 BYTE),
"ATTR_ID" NUMBER(16,0),
"OBJ_ID" NUMBER(16,0)
)
============================================================
Цель: есть table_id и obj_id
Задача:
Получить в результате таблицу в ее конечном виде, т.е. колонки в нужном порядке, значения по строкам.
БД: Oracle;
ПОдскажите кто, а?(
Спустя 7 минут, 25 секунд (4.04.2012 - 14:07) glock18 написал(а):
И, что это все одним sql-ем хочется?
Спустя 1 минута, 53 секунды (4.04.2012 - 14:09) vital написал(а):
Цитата (glock18 @ 4.04.2012 - 13:07) |
И, что это все одним sql-ем хочется? |
pl/sql -ем
Хочется, да.
Ну или хотя бы подсказки как рациональнее сделать. Я просто теряюсь.
Спустя 8 минут, 33 секунды (4.04.2012 - 14:18) glock18 написал(а):
Хочется - одно. Некоторые желания хуже всего.
Sql-сценарий могу предложить на основе mysql, в oracle схожие средства должны быть:
1. хранимая процедура
2. получаешь колонки для нужной таблицы
3. билдишь запрос в строку - в mysql запрос из строки можно скармливать prepare, таким образом можно избавиться от статичности запроса. соответственно, выполняешь получившийся запрос
4. заполняешь полученную таблицу данными из второй таблицы. легко решается одним insert-select.
Ну, это если я правильно понял суть среди описаний колонок
Sql-сценарий могу предложить на основе mysql, в oracle схожие средства должны быть:
1. хранимая процедура
2. получаешь колонки для нужной таблицы
3. билдишь запрос в строку - в mysql запрос из строки можно скармливать prepare, таким образом можно избавиться от статичности запроса. соответственно, выполняешь получившийся запрос
4. заполняешь полученную таблицу данными из второй таблицы. легко решается одним insert-select.
Ну, это если я правильно понял суть среди описаний колонок
Спустя 58 секунд (4.04.2012 - 14:19) glock18 написал(а):
А вообще задача решается несколько легче, разделив логику. В этом случае даже думаю, что это более корректно.
Спустя 1 час, 6 минут, 44 секунды (4.04.2012 - 15:26) vital написал(а):
Цитата (glock18 @ 4.04.2012 - 13:19) |
А вообще задача решается несколько легче, разделив логику. В этом случае даже думаю, что это более корректно. |
Подробнее, если не сложно.
Какие запросы, какой резалт получить, что бы на стороне пхп обрабатывать
Много вариантов ведь очень.
Спустя 3 минуты, 27 секунд (4.04.2012 - 15:29) glock18 написал(а):
Цитата (vital @ 4.04.2012 - 12:26) |
Много вариантов ведь очень. |
серьезно? какие, например? я один вижу
Спустя 24 минуты, 50 секунд (4.04.2012 - 15:54) vital написал(а):
Цитата (glock18 @ 4.04.2012 - 14:29) | ||
серьезно? какие, например? я один вижу |
Ну выборку из бд по разному можно сделать.
Простейший случай
SELECT DISTINCT a.table_id, a.row_id, a.attr_id, a.item_value, b.position from kf_table_attr_value a, kf_table_columns b
where a.obj_id = 132 and a.table_id = b.table_id group by a.table_id, a.row_id, a.attr_id, a.item_value, b.position order by a.row_id
Но такой вариант не совсем удобно как мне кажется потом парсить.
Есть лучше?
Спустя 1 час (4.04.2012 - 16:54) vital написал(а):
SELECT DISTINCT table_id, row_id, attr_id, item_value, position from kf_table_attr_value natural join kf_table_columns where obj_id = 449 and table_id = 3 order by row_id, position
Делает удобную таблицу. Прикольный джоин.
Спустя 34 минуты, 40 секунд (4.04.2012 - 17:29) glock18 написал(а):
Чисто в sql вы такое не распарсите. Поэтому нужно упрощать результаты - сперва выбираете колонки, создаете таблицу, а потом уже заполняете ее.
На стороне php вы можете такое парсить, но как по мне это и для пыха криво будет
На стороне php вы можете такое парсить, но как по мне это и для пыха криво будет
_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."
Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar