Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: не могу составить запрос для Interbase - объясните, плиз, на примере MySQL.
 
 автор: elenaki   (12.06.2007 в 13:51)   письмо автору
 
 

не могу составить запрос для Interbase.

есть таблица с описанием документа.

CREATE TABLE ROMDOCS (
       DOCSID ID /*Integer NOT NULL*/ NOT NULL,
       SECID SMALLID /*Smallint NOT NULL*/ NOT NULL,
       STARTDATE Integer,
       STOPDATE Integer,
       DESCRIPTION MEMO /*Blob SUB_TYPE 1 */,
       WIDTH DIMENSION /*Numeric(6,2) */,
       HEIGHT DIMENSION /*Numeric(6,2) */,
       GROUPNO ID /*Integer NOT NULL*/ NOT NULL,
       USRID SMALLID /*Smallint NOT NULL*/,
       BDATE TIMESTAMP,
       SECURITYID SMALLID /*Smallint NOT NULL*/ NOT NULL,
       STATUSID MEDIUMCODES /*Varchar(12) */ COLLATE WIN1253,
       FROMDATE Date,
       TODATE Date,
       CONSTRAINT PK_ROMDOCS PRIMARY KEY (DOCSID,SECID)
);


есть таблица имен, встречающихся в этом документе

CREATE TABLE ROMDOCS_MEN_LINK (
       ID ID /*Integer NOT NULL*/,
       DOCSID ID /*Integer NOT NULL*/ NOT NULL,
       SECID SMALLID /*Smallint NOT NULL*/ NOT NULL,
       MANNAME NAME40 /*Varchar(40) */,
       MANROLEID SMALLID /*Smallint NOT NULL*/ NOT NULL,
       MANKEYID SMALLID /*Smallint NOT NULL*/ NOT NULL,
       GROUPID SMALLID /*Smallint NOT NULL*/ NOT NULL,
       GROUPNO ID /*Integer NOT NULL*/ NOT NULL,
       CONSTRAINT PK_ROMDOCS_MEN_LINK PRIMARY KEY (ID)
);



есть таблица ролей, выполняемых людьми, чьи имена встречаются в документе

CREATE TABLE MANROLES (
       ID SMALLID /*Smallint NOT NULL*/ NOT NULL,
       NAME MEDIUMNAME /*Varchar(30) */,
       CONSTRAINT PK_MANROLES PRIMARY KEY (ID)
);

задача - выбрать документы за период (если период не установлен, то все),
удовлетворяющие дополнительным условиям - имя человека или название места (с названиями мест точно такие же таблицы).

за период у меня выбирается. и отдельно с указанием места или имени - выбирается. а все вместе никак не соединить.

в таблице имен имя может состоять из нескольких строк, а определить, где кончается одно
имя и начинается другое, относящееся к этому же документу, можно по полю GROUPNO -
номер группы. пока он, номер, одинаковый - это все одно имя. надо вывести сначала полное
имя, потом роль. если есть еще имена - опять полное имя, потом роль. с местностями тоже
самое. у меня как я ни стараюсь, выводится роль после каждого имени. (т.е. после каждой строки из таблицы имен, относящихся к выбранному документу).

надо как-то группировать. но на GROUP BY сервер базы выдает ошибку :(
not contained in either an aggregate function or the GROUP BY clause

   
 
 автор: Trianon   (12.06.2007 в 15:27)   письмо автору
 
   для: elenaki   (12.06.2007 в 13:51)
 

дамп с примером поглядеть можно?
Взаимосвязи как-то очень туманно прослеживаются....

   
 
 автор: elenaki   (12.06.2007 в 17:59)   письмо автору
 
   для: Trianon   (12.06.2007 в 15:27)
 

вопрос временно снимается. порывшись в базе (базу делала не я, мне ее прислали с Афона),
обнаружила множество таблиц VIEWS. там в метаданных есть запросы. и тот, что меня
интересует, вроде тоже есть. буду разбираться...

   
 
 автор: elenaki   (13.06.2007 в 10:52)   письмо автору
 
   для: elenaki   (12.06.2007 в 17:59)
 

вот, что у меня получилось. скриншот в аттаче...
выводятся составляющие имен построчно и в каждой строке - роль.
ой! группы забыла. там, где docsid=21, есть 2 имени, поэтому в поле
groupno стоит соответственно 1 и 2. у других - только единицы.

надо из трех-чертырех строк имени составить одно и после имени вставить роль -
Антиохос Кантемир принц Молдавии, отправитель
Михаил Федорович царь России, отправитель
Митрофан игумен, получатель
Кузьма Лаодикьяс игумен Путны, получатель


одним запросом не получится, скорее всего. надо делать подзапрос. вот запрос


SELECT
  M.DOCSID,
  M.SECID,
  ML.MANNAME,
  MR.NAME AS "MANROLE",
  MK.NAME AS "MANKEY",
  ML.GROUPNO,
  M.STARTDATE,
  M.STOPDATE,
  MK.ID AS KEYID,
  MR.ID AS ROLEID,
  M.DESCRIPTION,
  ML.GROUPID
FROM
  ROMDOCS_MEN_LINK ML
  INNER JOIN MANROLES MR ON (ML.MANROLEID = MR.ID)
  INNER JOIN MANKEYS MK ON (ML.MANKEYID = MK.ID)
  INNER JOIN ROMDOCS M ON (ML.DOCSID = M.DOCSID)

   
 
 автор: Trianon   (13.06.2007 в 11:31)   письмо автору
 
   для: elenaki   (13.06.2007 в 10:52)
 

Я могу сказать, как это сделать на MySQL, но не представляю соответствующих средств INTERBASE

На MySQL сбор строк из группы в одно поле делается с помощью совершенно зубодробительной агрегатной функции GROUP_CONCAT()


SELECT GROUP_CONCAT(MANNAME ORDER BY GROUPID ASC SEPARATOR ' ') AS FullName, КлючГруппы
GROUP BY КлючГруппы
Потом этот запрос JOINится с Вашим...
Только чтоб я помер, если понимаю что служит ключом группы.
Что все эти ключи MANROLEID, MANKEYID, и DOCSID означают, и какие сущности определяют соответствуюющие им первичные ключи ....

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования