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

Форум MySQL

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

 

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

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

тема: Правильно написать многотабличный запрос
 
 автор: dimon   (28.10.2007 в 21:45)   письмо автору
 
 

Люди, подскажите, как правильно делаются многотабличные запросы. Я с MySQL еще на уровне операторов SELECT и INSERT с простейшими условиями.
Ситуация: есть две таблицы:
orderinfo:
CREATE TABLE `orderinfo` (
  `id` int(11) NOT NULL auto_increment,
  `company` tinytext NOT NULL,
  `based_on` tinytext,
  `delivery` tinytext,
  `addr` tinytext NOT NULL,
  `docnum` tinytext NOT NULL,
  `incomingdate` date NOT NULL default '0000-00-00',
  `postdate` date NOT NULL default '0000-00-00',
  `priority` enum('!!!','none') NOT NULL default 'none',
  `status` enum('no','seen','checked','shipped','done','imlauf') NOT NULL default 'no',
  PRIMARY KEY  (`id`),
  KEY `docnum` (`docnum`(5))
) ENGINE=MyISAM DEFAULT CHARSET=cp1251

и orderequip:
CREATE TABLE `orderequip` (
  `id_order` int(11) NOT NULL auto_increment,
  `docnum` tinytext NOT NULL,
  `equipment` tinytext NOT NULL,
  `quantity` int(5) NOT NULL default '0',
  `commets` tinytext NOT NULL,
  PRIMARY KEY  (`id_order`),
  KEY `docnum` (`docnum`(3))
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Суть такая, что в первую таблицу записывается информация о перевозках, во второй таблице, записывается перевозимое оборудование. У каждой перевозки есть уникальный номер документа ("docnum") который я и расчитываю использовать для сопоставления информации о перевозке с перевозимыми товарами. Лажа в том, что каждое оборудование записывается в отдельную строку таблицы. Получается так, что в таблице с товаром будет много строк, содержащий одну и ту же запись docnum, а в таблице с информацией этот номер будет уникален для каждой записи. А теперь, уважаемые знатоки, внимание вопрос:
Как мне построики sql запрос так, чтобы из таблиц обеих я мог доставать все вышеуказаные данные с условием orderequip.docnum = orderinfo.docnum, и возможно ли такое вообще?
Спасибо!
P.S. Пока искал похожуу тему, примерно представляю, что нужно использовать JOIN ... ON... или GROUP BY? но не понимаю что онb дела.т... в стандартном MySQL мануале расписан только синтаксис. Если у кого будет желание объяснить мне популярно, что делает JOIN и GROUP BY, буду рад :))

   
 
 автор: Борис   (29.10.2007 в 00:00)   письмо автору
 
   для: dimon   (28.10.2007 в 21:45)
 

По простому(может есть и более красивые решения). Я бы сделал в твоём случае три следующие таблицы (если планируется что одно и то же оборудование может повторятся много раз).
1) Таблица с заказами


CREATE TABLE `orders` ( 
  `id` int(11) NOT NULL auto_increment ,  
  `company` tinytext NOT NULL, 
  `based_on` tinytext, 
  `delivery` tinytext, 
  `addr` tinytext NOT NULL, 
  `incomingdate` date NOT NULL default '0000-00-00', 
  `postdate` date NOT NULL default '0000-00-00', 
  `priority` enum('!!!','none') NOT NULL default 'none', 
  `status` enum('no','seen','checked','shipped','done','imlauf') NOT NULL default 'no', 
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 


2) Таблица со всем оборудованием которая заполняется отдельно, там перечисленно всё имеющееся оборудование никакой связи с таблицей заказов в данной таблице нету


CREATE TABLE `equip` ( 
  `id` int(11) NOT NULL auto_increment,
  `equipment` tinytext NOT NULL, 
  `quantity` int(5) NOT NULL default '0', 
  `commets` tinytext NOT NULL, 
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251; 


3) Сама таблица связей, указывающая какое оборудование к какому заказу относится.

CREATE TABLE `order_equip` ( 
  `id` int(11) NOT NULL auto_increment,
  `order_id` tinytext NOT NULL, 
  `equip_id` int(5) NOT NULL default '0'
  PRIMARY KEY  (`id`), 
  INDEX (`order_id`, `equip_id`)
)

После заполнения таблицы с оборудованием(equip) надо будет только заполнить таблицу связей( order_equip) связью order_equip.order_id=orders.id - Определяем к какому заказу относится единица оборудования, order_equip.equip_id=equip.id - Определяем какое именно оборудование подразумевается под единицей оборудования.

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

//nahodim vse zakazq
$query="select * from orders";
$order_result=mysql_query($query);
//esli imejutsja zakazq vqvodim zakazq na ekran
if (mysql_num_rows($order_result)>0)
{
    while ($orders=mysql_fetch_array($order_result))
    {
        echo "<pre>";
        print_r($orders);
        echo "</pre>";
        
        //nahodim po svjazi imeetsja li oborudovanie u zakaza
        $query="select equip.* from order_equip 
                                          LEFT JOIN equip ON equip.id=order_equip.equip_id
                                           where order_equip.order_id={$orders['id']} ";
        $equip_result=mysql_query($query);
        
        //esli imeetsja vqvodim ego
        if (mysql_num_rows($equip_result)>0)
        {
            while ($equip=mysql_fetch_array($equip_result))
            {
                    echo "<pre>";
                    print_r($equip);
                    echo "</pre>";
            }
        echo "<br/><br/><br/>";
        }
    }
}


P.S. могут быть синтаксически ошибки

   
 
 автор: dimon   (29.10.2007 в 09:26)   письмо автору
 
   для: Борис   (29.10.2007 в 00:00)
 

вариант с тремя таблицами интересен, спасибо, но тут проблема в том что чёткого списка всего оборудования нет. А при заполнении заявки на транспорт происходит разбитие двух блоков текста, перенесённых из 1С. Оттуда все данные и берутся. Можно было бы создавать новую запись, при обнаружении нового типа оборудования, но каждая единица имеет некий список опций, которые потом будут перечисляться вместе с оборудованием... в общем запутано тут все. Если б то, что я пытаюсь сделать делалось бы с самого начала создания всей системы управления транспортом, то можно было б что-нибудь путное сотворить, а так это я некий модуль пишу, веб-приложение, а заодно и учусь :) (что, для меня, не мало важно)...
Но с другой стороны, вполне осмысленная идея, но как бороться с переполнением БД практически идентичными типами оборудования. Скажем есть наименование "SAMSUNG SGH-500" и "SAMSUNG SGH500" (имена произвольные) плюс опции...

   
Rambler's Top100
вверх

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