Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Помогите составить запрос


Автор: slang 2.8.2007, 20:43
Помогите составить запрос.
Есть таблицы (упрощенно, конечно):
Table_1 (user)
-id
-name
Table_2 (авто)
-id
-id_user
-auto
Table_3 (запрос)
-id
-id_user
-id_auto
-numzapros (номер запроса)
-date (дата формирования запроса)
-zapros


Требуется составить запрос, чтобы на выходе получить html типа:

Код

заголовок таблицы: auto(Table_2) - name(Table_1) - numzapros (Table_3)
строка с данными: zapros (Table_3)
строка с данными: zapros (Table_3)
строка с данными: zapros (Table_3)


у меня есть только мысля:
1. выбрать все разные numzapros сортируя их по дате
2. берем номер первого запроса
3. выбираем инфу по id_auto и id_user из соответствующих таблиц (сформировали первую строку)
4. выбираем все запросы с таким номером (сформировали строки с данными)
5. переходим к следующему номеру запроса
6. переходим к пункту 3

в этом случае получается 1+2*количество запросов (из пункта 1) запросов к базе данных.
из пункта 1 за месяц набирается около 1000 запросов, таким образом, примерно, через месяц для того чтобы сформировать такую страницу необходимо будет выполнить 2001 запрос к базе данных - многовато получается, не так ли?
Подскажите, как можно это реализовать по другом?

Автор: Fin 3.8.2007, 00:02
А какие хоть логические связи в таблицах?

Автор: slang 3.8.2007, 08:41
Цитата(Fin @ 3.8.2007,  00:02)
А какие хоть логические связи в таблицах?

Table_1 (user)
-id (ключевое поле)
-name
Table_2 (авто)
-id
-id_user (связь с Table_1, поле id)
-auto
Table_3 (запрос)
-id
-id_user (связь с Table_1, поле id)
-id_auto (связь с Table_2, поле id)

-numzapros (номер запроса)
-date (дата формирования запроса)
-zapros

Автор: slang 3.8.2007, 16:11
у меня получается что-то на подобие этого:
Код

        $sql = "SELECT DISTINCT `numzapros` FROM " . $GLOBALS['table_zapros'] . " ORDER BY id";
        $result = DbQuery($sql);
        while ($temp = mysql_fetch_array($result, MYSQL_ASSOC)) {
            $zapros[] = $temp['numzapros'];
        }
        foreach ($zapros as $k=>$v)    {
            $sql = "SELECT `auto_id`, `user_id` FROM " . $GLOBALS['table_zapros'] . " WHERE `numzapros` = '" . $v . "' LIMIT 0,1";
            $result = DbQuery($sql);
            $temp = mysql_fetch_array($result, MYSQL_ASSOC);
            $sql = "SELECT * FROM " . $GLOBALS['table_account'] . " WHERE `id`=" . $temp['user_id'];
            $result = DbQuery($sql);
            $records = mysql_fetch_array($result, MYSQL_ASSOC);
            print "<BR>Запрос:" . $v . " заказчик: " . $records['name'];
            
            $sql = "SELECT * FROM " . $GLOBALS['table_auto'] . " WHERE `id`=" . $temp['auto_id'];
            $result = DbQuery($sql);
            $records = mysql_fetch_array($result, MYSQL_ASSOC);
            print " (автомобиль: " . $records['marka'] . " " . $records['model'] . ")";
            
            $sql = "SELECT * FROM " . $GLOBALS['table_zapros'] . " WHERE `numzapros` = '" . $v . "'";
            $result = DbQuery($sql);
            while ($temp = mysql_fetch_array($result, MYSQL_ASSOC)) {
                print "<BR>" . $temp['id'] . "/" . $temp['detalrus'];
            }
        }

сама бд:
Код

-- 
-- Структура таблицы `auto_auto`
-- 

CREATE TABLE `auto_auto` (
  `id` int(11) NOT NULL auto_increment,
  `user_id` int(11) NOT NULL default '0',
  `marka` varchar(20) NOT NULL default '',
  `model` varchar(20) NOT NULL default '',
  `nummark` varchar(20) NOT NULL default '',
  `drivetype` varchar(20) NOT NULL default '',
  `table` varchar(20) NOT NULL default '',
  `cuzov` varchar(14) NOT NULL default '',
  `typekpp` varchar(10) NOT NULL default '',
  `country` varchar(20) NOT NULL default '',
  `vin` varchar(20) NOT NULL default '',
  `year` varchar(4) NOT NULL default '',
  `month` char(2) NOT NULL default '',
  `abs` varchar(4) NOT NULL default '',
  `hidro` varchar(4) NOT NULL default '',
  `volume` varchar(5) NOT NULL default '',
  `privod` varchar(10) NOT NULL default '',
  `cond` varchar(4) NOT NULL default '',
  `rem` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='авто';

-- --------------------------------------------------------

-- 
-- Структура таблицы `auto_login`
-- 

CREATE TABLE `auto_login` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL default '',
  `login` varchar(10) NOT NULL default '',
  `pass` varchar(32) NOT NULL default '',
  `email` varchar(50) NOT NULL default '',
  `phone` varchar(12) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='аккаунт';

-- --------------------------------------------------------

-- 
-- Структура таблицы `auto_zapros`
-- 

CREATE TABLE `auto_zapros` (
  `id` int(11) NOT NULL auto_increment,
  `user_id` int(11) NOT NULL default '0',
  `auto_id` int(11) NOT NULL default '0',
  `gorod` varchar(20) NOT NULL default '',
  `numzapros` varchar(20) NOT NULL default '',
  `datezapros` date NOT NULL default '0000-00-00',
  `timezapros` time NOT NULL default '00:00:00',
  `dateend` date NOT NULL default '0000-00-00',
  `detaleng` varchar(100) NOT NULL default '',
  `detalrus` varchar(100) NOT NULL default '',
  `detalnumor` varchar(20) NOT NULL default '',
  `katalognumor` varchar(50) NOT NULL default '',
  `detalnumdubl` varchar(20) NOT NULL default '',
  `katalognumdubl` varchar(50) NOT NULL default '',
  `detaltype` varchar(20) NOT NULL default '',
  `sostzapros` varchar(20) NOT NULL default '',
  `rem` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='запросы';


Автор: sTa1kEr 3.8.2007, 19:07
slang, странная у вас структура базы. Почему бы вам не вынести детали запроса в отдельную таблицу? Т.е., к примеру, таблица
Код

CREATE TABLE `auto_addinfo` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `zapros` INTEGER UNSIGNED NOT NULL,
  `detaleng` VARCHAR(100) NOT NULL,
  `detalrus` VARCHAR(100) NOT NULL,
  -- итд остальные детали запроса
  PRIMARY KEY (`id`)
)
ENGINE = MyISAM
COMMENT = 'дополнительная информация';

Тогда запрос сразу станет предельно простым
Код

SELECT aa.`marka`, aa.`model`, al.`name`, az.`numzapros`, ad.`detalrus` FROM auto_zapros az
LEFT JOIN auto_auto aa ON aa.id=az.auto_id
LEFT JOIN auto_login al ON al.id=az.user_id
LEFT JOIN auto_addinfo ad ON az.numzapros = ad.zapros;

Или же, если я не правильно понял задачу, то можно пример данных таблицы auto_zapros?

Автор: slang 3.8.2007, 20:19
sTa1kEr, так и есть, детали запроса в отдельной таблице, в ней же поля для связи с двумя другими таблицами.
пример таблиц:
Код

-- Структура таблицы `auto_auto`
-- 

CREATE TABLE `auto_auto` (
  `id` int(11) NOT NULL auto_increment,
  `user_id` int(11) NOT NULL default '0',
  `marka` varchar(20) NOT NULL default '',
  `model` varchar(20) NOT NULL default '',
  `nummark` varchar(20) NOT NULL default '',
  `drivetype` varchar(20) NOT NULL default '',
  `table` varchar(20) NOT NULL default '',
  `cuzov` varchar(14) NOT NULL default '',
  `typekpp` varchar(10) NOT NULL default '',
  `country` varchar(20) NOT NULL default '',
  `vin` varchar(20) NOT NULL default '',
  `year` varchar(4) NOT NULL default '',
  `month` char(2) NOT NULL default '',
  `abs` varchar(4) NOT NULL default '',
  `hidro` varchar(4) NOT NULL default '',
  `volume` varchar(5) NOT NULL default '',
  `privod` varchar(10) NOT NULL default '',
  `cond` varchar(4) NOT NULL default '',
  `rem` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='авто' AUTO_INCREMENT=3 ;

-- 
-- Дамп данных таблицы `auto_auto`
-- 

INSERT INTO `auto_auto` VALUES (1, 1, 'Toyota', 'Camry', '', '', '', '---', '---', '', '', '1995', '6', '---', '---', '', '---', '---', '            ');
INSERT INTO `auto_auto` VALUES (2, 2, 'BMW', 'uyih huik', '', '', '', '---', '---', '', '', '', '', '---', '---', '', '---', '---', '            ');

-- --------------------------------------------------------

-- 
-- Структура таблицы `auto_login`
-- 

CREATE TABLE `auto_login` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL default '',
  `login` varchar(10) NOT NULL default '',
  `pass` varchar(32) NOT NULL default '',
  `email` varchar(50) NOT NULL default '',
  `phone` varchar(12) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='аккаунт' AUTO_INCREMENT=3 ;

-- 
-- Дамп данных таблицы `auto_login`
-- 

INSERT INTO `auto_login` VALUES (1, 'Петров Петр', 'slang', '86792d8c65e64206d662b7c177b23105', '[email protected]', '0959412222');
INSERT INTO `auto_login` VALUES (2, 'Иванов Иван Иванович', 'ivan', '2c42e5cf1cdbafea04ed267018ef1511', '[email protected]', '9042838909');

-- --------------------------------------------------------

-- 
-- Структура таблицы `auto_zapros`
-- 

CREATE TABLE `auto_zapros` (
  `id` int(11) NOT NULL auto_increment,
  `user_id` int(11) NOT NULL default '0',
  `auto_id` int(11) NOT NULL default '0',
  `gorod` varchar(20) NOT NULL default '',
  `numzapros` varchar(20) NOT NULL default '',
  `datezapros` date NOT NULL default '0000-00-00',
  `timezapros` time NOT NULL default '00:00:00',
  `dateend` date NOT NULL default '0000-00-00',
  `detaleng` varchar(100) NOT NULL default '',
  `detalrus` varchar(100) NOT NULL default '',
  `detalnumor` varchar(20) NOT NULL default '',
  `katalognumor` varchar(50) NOT NULL default '',
  `detalnumdubl` varchar(20) NOT NULL default '',
  `katalognumdubl` varchar(50) NOT NULL default '',
  `detaltype` varchar(20) NOT NULL default '',
  `sostzapros` varchar(20) NOT NULL default '',
  `rem` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='запросы' AUTO_INCREMENT=13 ;

-- 
-- Дамп данных таблицы `auto_zapros`
-- 

INSERT INTO `auto_zapros` VALUES (1, 1, 1, 'Омск', 'Инт-1', '2007-08-02', '12:37:02', '2007-08-02', '', 'крыло левое', '', 'Toyota', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (2, 1, 1, 'Омск', 'Инт-1', '2007-08-02', '12:37:07', '2007-08-02', '', 'крыло правое', '', 'Toyota', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (3, 1, 1, 'Омск', 'Инт-1', '2007-08-02', '12:37:12', '2007-08-02', '', 'фара левая', '', 'Toyota', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (4, 1, 1, 'Омск', 'Инт-1', '2007-08-02', '12:37:17', '2007-08-02', '', 'фара правая', '', 'Toyota', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (5, 1, 1, 'Омск', 'Инт-2', '2007-08-02', '13:36:48', '2007-08-02', '', 'корпус печки', '', '', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (6, 2, 2, 'Омск', 'Инт-3', '2007-08-03', '23:06:31', '2007-08-03', '', 'деталь 1', '', 'BMW', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (7, 2, 2, 'Омск', 'Инт-3', '2007-08-03', '23:06:39', '2007-08-03', '', 'деталь 5', '', 'BMW', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (8, 2, 2, 'Омск', 'Инт-3', '2007-08-03', '23:06:48', '2007-08-03', '', 'крыло', '', 'BMW', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (9, 2, 2, 'Омск', 'Инт-4', '2007-08-03', '23:07:10', '2007-08-03', '', 'фара', '', 'BMW', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (10, 2, 2, 'Омск', 'Инт-5', '2007-08-03', '23:15:10', '2007-08-03', '', 'фара', '', 'BMW', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (11, 2, 2, 'Омск', 'Инт-6', '2007-08-03', '23:15:17', '2007-08-03', '', 'фара', '', 'BMW', '', '', 'Любая', 'не определено', '');
INSERT INTO `auto_zapros` VALUES (12, 2, 2, 'Омск', 'Инт-7', '2007-08-03', '23:15:19', '2007-08-03', '', 'фара', '', 'BMW', '', '', 'Любая', 'не определено', '');
        

Мне вот еще интересно, как правильнее, загонять все таблицы в массив одним запросом, или делать множество запросов. Как быстрее и легче системе?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)