Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Таблица с связями внутри к другим таблицам.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Viper
Отправлено: 15 Июня, 2012 - 15:04:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Есть плоская таблица вида
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE `slv6b_jrnl_tbl_000002` (
  2.   `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3.   `id_group` int(11) NOT NULL,
  4.   `id_subgroup` int(11) NOT NULL,
  5.   `uid` int(11) NOT NULL,
  6.   `number` int(11) NOT NULL,
  7.   `event` text NOT NULL,
  8.   `datetime_start` datetime DEFAULT NULL,
  9.   `datetime_end` datetime DEFAULT NULL,
  10.   `date_create` datetime NOT NULL,
  11.   `tbl_000009` int(11) NOT NULL,
  12.   `parent_event_id` bigint(20) NOT NULL,
  13.   `published` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',
  14.   PRIMARY KEY (`id`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8


Вроде бы просто выбрать отсюда данные, но! Колонка tbl_000009 является именем другой таблицы хранящей данные для этой колонки, а само поле содержит id строки с данными из этой таблицы. Основная проблема в том что таких колонок может быть n-ое количество, а может и не быть вовсе. Таблицу связей использовать нельзя.

Как в таком случае можно выгрести данные из другой таблицы и вставить в поле?

PS! Если это можно сделать через функцию или процедуру, то опишите как(с ними не сталкивался и тяжело к пониманию).


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
EuGen Администратор
Отправлено: 15 Июня, 2012 - 15:22:19
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Думаю, проще будет сделать:
0. В скрипте: SHOW CREATE TABLE / DESCRIBE
1. Выбрать по шаблону колонки, указывающие на связи с таблицами
2. Сгенерировать текст запроса (разумеется, на каждое вхождение будет JOIN по FK)
Правильнее будет изменить логику/структуру во избежание таких конструкций.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Viper
Отправлено: 15 Июня, 2012 - 15:35:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




EuGen пишет:
Правильнее будет изменить логику/структуру во избежание таких конструкций.
это понятно что идея такой структуры плоха(уже ощутили всю прелесть на выборке 100к записей с лимитами и фильтрами на оракле(2,5 секунды запрос через toad)). Пример можно какой-то привести?

Дело в том что это система журналирования и кол-во полей заранее неизвестно. Изначально через конструктор создается таблица с нужными полями, а поля с данными из других таблиц указываются так как я описал выше. Уйти от данных из других таблиц и создавать жесткую структуру не получится т.к. некоторые данные используются в многих местах системы одновременно.

PS! Собстно описание полей таблицы выглядит так

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE `slv6b_jrnl_tbl_schemas` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `tbl_id` varchar(6) NOT NULL,
  4.   `fields` text,
  5.   PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8


tbl_id это id таблицы приведенной в первом посте.
fields массив вида
CODE (htmlphp):
скопировать код в буфер обмена
  1. [{"name":"id","type":"bigint","size":20,"show":"0"},{"name":"id_group","type":"int","size":11,"show":"0"},{"name":"id_subgroup","type":"int","size":11,"show":"0"},{"name":"uid","type":"int","size":11,"show":"0"},{"name":"number","type":"int","size":11,"label":"COM_J_NUMBER","show":"1","order":"0"},{"name":"event","type":"text","label":"COM_J_EVENT","show":"1","order":"3"},{"name":"datetime_start","type":"datetime","label":"COM_J_DATETIMESTART","show":"1","order":"1"},{"name":"datetime_end","type":"datetime","label":"COM_J_DATETIMEEND","show":"1","order":"2"},{"name":"date_create","type":"datetime","show":"0"},{"name":"tbl_000009","type":"int","size":11,"show":"1","order":"4","label":"COM_J_EVENT_TYPE"},{"name":"parent_event_id","type":"bigint","size":20,"show":"0"},{"name":"published","type":"tinyint","size":1,"default":"1","show":"0"}]


Вроде все необходимые данные привел для понимания. Сам я уже голову сломал придумывая как бы так реализовать как можно проще создание динамических таблиц с связанными данными.

(Отредактировано автором: 15 Июня, 2012 - 15:38:00)



-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
EuGen Администратор
Отправлено: 15 Июня, 2012 - 15:41:31
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Не очень понимаю сложность. Могу, конечно, и готовое что-нибудь сделать, но принцип же прост:
0. Делаете mysql_query('DESCRIBE `'.название_таблицы.'`');
1. Предыдущий запрос вернет список колонок. Из этого списка в соответствии слогикой приложения отбираете те, которые являются названиями таблиц. Если нет никакого принципа, по которому такие таблицы именуются, то делаете mysql_query('SHOW TABLES FROM `'.название_БД.'`'); - это вернет список таблиц. По нему проверяете, какие именно присутствуют в списке колонок, которые вернул запрос на шаге 0. Итог шага 1 - готовый список таблиц
2. При помощи готового списка таблиц, полученного на шаге 1 (он будет, к примеру, в виде массива), генерируете текст запроса обычным циклом и конкатенацией, добавляя JOIN с именем таблицы, равной элементу обходимого в цикле массива.

Кажется, все просто, в чем возникает трудность?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Viper
Отправлено: 15 Июня, 2012 - 16:28:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




EuGen пишет:
Кажется, все просто, в чем возникает трудность?
вот теперь путь понятен Улыбка Буду ваять Улыбка


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB