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