Выборка из двух и более таблиц

VlastV

Новичок
Выборка из двух и более таблиц

Есть таблицы:
Код:
CREATE TABLE `calc_field` (
  `EId` int(10) unsigned NOT NULL auto_increment,
  `Name` varchar(255) NOT NULL default '',
  `Type` enum('string','select','radio','checkbox') NOT NULL default 'string',
  PRIMARY KEY  (`EId`),
  UNIQUE KEY `EId` (`EId`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251

CREATE TABLE `calc_value` (
  `EId` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`EId`),
  UNIQUE KEY `EId` (`EId`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251

CREATE TABLE `calc_tree` (
  `EId` int(11) NOT NULL default '0',
  `EType` varchar(50) NOT NULL default '',
  `EName` varchar(255) NOT NULL default '',
  `PId` int(11) NOT NULL default '0',
  `PType` varchar(50) NOT NULL default '',
  `SLKey` int(11) NOT NULL default '0',
  `SRKey` int(11) NOT NULL default '0',
  `SDepth` int(11) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
Возможно ли как нибудь, одним или не на много больше запросами получить все строчки из calc_tree с соответствующими до наборами полей из таблиц.

Пример записей в calc_tree:
Код:
EId     EType   EName                   PId     PType   SLKey   SRKey   SDepth
0       system  calc                    0       system  1       42      0
2       process Высечка                 0       system  38      41      1
1       process Тиснение                0       system  2       37      1
6       field   Формат                  2       process 39      40      2
7       field   Формат                  1       process 3       34      2
1       value   до А3+ (35х50)          7       field   4       29      3
2       value   до А2+                  7       field   30      31      3
В поле EType имя названия таблицы в которой находяться дополнительные поля. calc_field означает что модуль Calc (его я получаю параметром) и field из calc_tree береться в полу EType. Если чем то может сгодиться, есть поле PType имеющие название таблицы родительского элемента.

Если возникнут какие доп вопросы, для помощи мне, задавайте, оперативно буду отвечать.
 

alpine

Новичок
VlastV
Можно еще раз про связи между таблицами?(желательно внятно)
 

VlastV

Новичок
Если посомтреть структуру таблиц, то видно:
..._tree это системная таблица для хронения дерева по принцепу множеств

остальные таблицы соответствуют "Типам данных"

Соотвтетственно основная таблица получаеться ..._tree в ней храниться информация необходимая для поддержания дерева, а так же EId - ид записи в таблице, название которой храниться в поле EType.

Т.е. допустим берем запись номер 4 по счету:
Код:
6       field   Формат                  2       process 39      40      2
из первого поля определяем = 6, из второго название таблицы = field
Теперь чтоб получить оставшиеся поля (не служебные), надо взять запись с EId = 6 в таблице ..._field.

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

alpine

Новичок
VlastV
Если я правильно все понял:

1) Выдергиваешь все id дополительныех полей и названия таблиц из calc_tree(допустим для Calc) - запрос #1
2) Используя UNION выдергиваешь необходмые данные из таблиц по id поля в этой таблице(которые ты выдернул первым запросом) - запрос #2
 

VlastV

Новичок
К сожалению нет не правельно ты понял.

В calc_tree храняться данные, одна запись это один объект данных. С полями из таблицы calc_tree и таблицы название которой храниться во второй колонке таблицы calc_tree.
 

alpine

Новичок
VlastV
Итак еще раз:
- У тебя в таблице *_tree хранится дерево объектов по смешанному алгоритму NestedSets(SLKey, SRKey, SDepth) и AdjacencyList(PId)
- Каждый объект(строка в таблице *_tree) имеет одно свойство которое находится в таблице *_${*_tree.EType} с *_${*_tree.EType}.EId=*_tree.EId

Задача: получить дерево объектов из таблицы *_tree и их свойства из связанных таблиц *_tree.EType c id *_tree.EId

* - префикс таблицы, таких таблиц много, совпадает с названием текущего модуля.

Так ?
 

alpine

Новичок
VlastV
Так вот, это *_${*_tree.EType}.EId=*_tree.EId (логика объединения таблиц) я не знаю как реализовать в MySQL-ле, поэтому думаю что такую логику объединения таблиц придется выносить в код.

где ${*_tree.EType} - переменная содержащая имя таблицы
 

VlastV

Новичок
но как тогда лучше сделать?

Допустим мне надо вытащить все ветку от кого-то элемента до корня.

Запрашивать доп поля из {*_tree.EType} с получением каждой объекта из tree не гуманно наверно.
 

alpine

Новичок
VlastV
Я же написал, - через UNION, если свойства имеют типичные поля то подойдет.
PS Так что не понял ты что я написал ;)
 

VlastV

Новичок
Да понял, я что ты написал:)
Как не как опыт программирования уже немаленький:)

Нет поля в таблицах типов данных разные:(

А возможно как то переконструировать эти таблицы но чтоб смысл их остался?
 

alpine

Новичок
VlastV
Скорее всего придется, так как попахивает не понимаем работы РСУБД :)
 

VlastV

Новичок
а ты можешь что нибудь предложить? сразу отмечу что не за меня сделать, а то тут будут писАть...

я думаю ты структуру уже понел, и понел скажем так смысл этого, я надеюсь:)
 

alpine

Новичок
VlastV
В поиск, типичные проблемы и их решения обсуждались(напомню, тебе нужно искать как тебе правильно хранить разнообразные свойства объекта в БД): свойств*
я думаю ты структуру уже понел, и понел скажем так смысл этого, я надеюсь
Главное чтобы ты сам хорошо понимал ;)
 
Сверху