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

Форум MySQL

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

 

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

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

тема: Трёхтабличный запрос
 
 автор: kis-kis   (02.04.2007 в 18:38)   письмо автору
 
 

Помогите составить запрос к базе данных, используется три таблицы:

1. Таблица где лежат названия улиц.

CREATE TABLE `map_streets` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(150) default NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 AUTO_INCREMENT=1 ;
--
-- Дамп данных таблицы `map_streets`
--
INSERT INTO `map_streets` VALUES (1, 'бульвар Строителей');

2. Изображения.
CREATE TABLE `map_image` (
`id` int(11) NOT NULL auto_increment,
`img` varchar(100) default NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
--
-- Дамп данных таблицы `map_image`
--
INSERT INTO `map_sectors` VALUES (1, '1.jpg');

3. Поисковый запрос.
CREATE TABLE `map_search` (
`id` int(11) NOT NULL auto_increment,
`street` varchar(250) default NULL,
`house` varchar(100) default NULL,
`image` varchar(100) default NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
--
-- Дамп данных таблицы `map_search`
--
INSERT INTO `map_sectors` VALUES (1,1, 100, 1');

При поиске по названию улицы нужно вывести соответствующее
изображение.

Спасибо за ответ.

   
 
 автор: Trianon   (02.04.2007 в 18:53)   письмо автору
 
   для: kis-kis   (02.04.2007 в 18:38)
 

>1. Таблица где лежат названия улиц....
...более менее понятна, чего не скажешь об остальном.


>2. Изображения.
>CREATE TABLE `map_image` (
>-- Дамп данных таблицы `map_image`
>INSERT INTO `map_sectors` VALUES (1, '1.jpg');
что это за map_sectors?


>3. Поисковый запрос.
>CREATE TABLE `map_search` (
> `id` int(11) NOT NULL auto_increment,
> `street` varchar(250) default NULL,
> `house` varchar(100) default NULL,
> `image` varchar(100) default NULL,
>-- Дамп данных таблицы `map_search`

т.е. имя - map_search, поля - целое и три строки, так?
А тут что?

>INSERT INTO `map_sectors` VALUES (1,1, 100, 1');

   
 
 автор: kis-kis   (02.04.2007 в 19:00)   письмо автору
 
   для: Trianon   (02.04.2007 в 18:53)
 

Простите, ошибся...

1. Таблица где лежат названия улиц.

CREATE TABLE `map_streets` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(150) default NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 AUTO_INCREMENT=1 ;
--
-- Дамп данных таблицы `map_streets`
--
INSERT INTO `map_streets` VALUES (1, 'бульвар Строителей');

2. Изображения.
CREATE TABLE `map_sectors` (
`id` int(11) NOT NULL auto_increment,
`img` varchar(100) default NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
--
-- Дамп данных таблицы `map_sectors`
--
INSERT INTO `map_sectors` VALUES (1, '1.jpg');

3. Поисковый запрос.
CREATE TABLE `map_search` (
`id` int(11) NOT NULL auto_increment,
`street` varchar(250) default NULL,
`house` varchar(100) default NULL,
`image` varchar(100) default NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
--
-- Дамп данных таблицы `map_search`
--
INSERT INTO `map_search` VALUES (1,1, 100, 1');

   
 
 автор: Trianon   (02.04.2007 в 19:03)   письмо автору
 
   для: kis-kis   (02.04.2007 в 19:00)
 

назначение третьей таблицы неясно.
Также удивляет, что 1,1,100,1 лежит в varchar-полях, даже если исправить ошибку в операторе insert

   
 
 автор: kis-kis   (02.04.2007 в 19:46)   письмо автору
 
   для: Trianon   (02.04.2007 в 19:03)
 

Поиск осуществляется по названию улицы и номеру дома.
map_streets - база улиц
map_sectors - участки карты
map_search - таблица, в которой указано - id - улицы, id - картинки, номер дома.

При поиске ищем совпадение в названии улицы и номера дома и загружаем определенный кусок карты.

   
 
 автор: Trianon   (02.04.2007 в 20:00)   письмо автору
 
   для: kis-kis   (02.04.2007 в 19:46)
 


SELECT img 
FROM map_streets JOIN map_search ON map_streets.id = map_search.street 
JOIN map_sectors ON image=map_sectos.id
WHERE house = $house_number AND name = '$street_name'

$house_number - очищенный номер дома
$street_name - заэкранированное название улицы

типы полей street, house и image в таблице map_search нужно исправить на INT(11)

   
 
 автор: kis-kis   (02.04.2007 в 20:00)   письмо автору
 
   для: kis-kis   (02.04.2007 в 19:46)
 

Т.к. вариантов поиска будет много, сделали 3 таблицы... Теперь более менее понятно что хотелось бы?

   
 
 автор: Trianon   (02.04.2007 в 20:11)   письмо автору
 
   для: kis-kis   (02.04.2007 в 20:00)
 

Нет. Совершенно непонятно.
Я написал ответ в предположении, что map_search - таблица, описывающая соответствие адресов картинкам. Соответствие это совершенно не зависит от того, запрашивал ли кто-либо какой-либо поиск, а если да , то сколько раз.

Из имени таблицы (да и Вы настаиваете, что это таблица поиска) делается вывод, что это не так. Тогда я не понимаю сути третьей таблицы.

   
 
 автор: kis-kis   (02.04.2007 в 20:16)   письмо автору
 
   для: kis-kis   (02.04.2007 в 20:00)
 

Может тогда так?


SELECT img  
FROM map_streets JOIN map_search ON map_streets.id = map_search.street  
JOIN map_sectors ON image=map_sectos.id 
WHERE house = $house_number AND name like '%$street%'

   
 
 автор: kis-kis   (02.04.2007 в 20:20)   письмо автору
 
   для: kis-kis   (02.04.2007 в 20:16)
 

Какая таблица Вы считаете лишняя?

   
 
 автор: Trianon   (02.04.2007 в 20:22)   письмо автору
 
   для: kis-kis   (02.04.2007 в 20:20)
 

ни одной лишней таблицы не заметил.
Если я таки прав - просто таблице имеет смысл дать другое название.
map_location например.

   
 
 автор: Trianon   (02.04.2007 в 20:21)   письмо автору
 
   для: kis-kis   (02.04.2007 в 20:16)
 

Если Вы готовы в в ответ на запрос улицы мира получить адмиралтейскую набережную - тогда конечно.

   
 
 автор: kis-kis   (02.04.2007 в 20:22)   письмо автору
 
   для: Trianon   (02.04.2007 в 20:21)
 

Что Вы посоветуете?

   
 
 автор: Trianon   (02.04.2007 в 20:26)   письмо автору
 
   для: kis-kis   (02.04.2007 в 20:22)
 

добавить в таблицу map_street поле с типом объекта. (улица, переулок, проспект, площадь, бульвар, набережная,шоссе, дорога, аллея) и не включать его в фильтр запроса.

   
 
 автор: kis-kis   (02.04.2007 в 20:38)   письмо автору
 
   для: Trianon   (02.04.2007 в 20:26)
 

Что-то вроде этого:

$query1 = "SELECT * FROM map_streets WHERE name like '%$street%'";
$result1=mysql_query($query1) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
$row1 = mysql_fetch_array($result1);

$query2 = "SELECT * FROM map_search WHERE street = $row1[id] and house = $house";
$result2=mysql_query($query2) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
$row2 = mysql_fetch_array($result2);

$query3 = "SELECT * FROM map_sectors WHERE id = $row2[image]";
$result3=mysql_query($query3) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
$row3 = mysql_fetch_array($result3);


Приблизительно такой запрос работает...

   
 
 автор: kis-kis   (03.04.2007 в 11:24)   письмо автору
 
   для: kis-kis   (02.04.2007 в 20:38)
 

Покороче нельзя сделать данный запрос?
Спасибо.

   
 
 автор: Trianon   (03.04.2007 в 11:36)   письмо автору
 
   для: kis-kis   (03.04.2007 в 11:24)
 

Вы попросили написать запрос , который бы делал следующее, цитирую:
При поиске по названию улицы нужно вывести соответствующее изображение.
Я предложил такой запрос - (02.04.2007 в 20:00) ,
Вы внесли незначительные коррективы (02.04.2007 в 20:16)
Заметьте - запрос один.
после чего написали код, формирующий три запроса, но не выводящий ничего (02.04.2007 в 20:38).
И спрашиваете, как сделать покороче.
После этого я окончательно перестал понимать, что же, собственно, требуется.

   
 
 автор: kis-kis   (03.04.2007 в 12:28)   письмо автору
 
   для: Trianon   (03.04.2007 в 11:36)
 

Почему не выводящий ничего?

echo $row3['img'];

Выведет нужное изображение...

   
 
 автор: Trianon   (03.04.2007 в 12:52)   письмо автору
 
   для: kis-kis   (03.04.2007 в 12:28)
 

Потому что этой строки в Вашем коде не было.

В варианте одного запроса нужное изображение выведет точно такая же строка.

   
 
 автор: kis-kis   (03.04.2007 в 13:49)   письмо автору
 
   для: Trianon   (02.04.2007 в 20:21)
 

Простите, а какой код будет оптимален? Ваш из одного запроса или тот из 3-х запросов? Или разницы нет никакой? Спасибо.

   
 
 автор: Trianon   (03.04.2007 в 13:50)   письмо автору
 
   для: kis-kis   (03.04.2007 в 13:49)
 

Из одного.

   
 
 автор: kis-kis   (03.04.2007 в 14:57)   письмо автору
 
   для: Trianon   (03.04.2007 в 13:50)
 

Простите, а как тогда будет выглядеть сам вывод изображения?
С вашим кодом?


echo $row3['img'];

   
 
 автор: Trianon   (03.04.2007 в 15:15)   письмо автору
 
   для: kis-kis   (03.04.2007 в 14:57)
 

Да точно также, как и с Вашим:
<?
$query3 
"SELECT img  
FROM map_streets JOIN map_search ON map_streets.id = map_search.street  
JOIN map_sectors ON image=map_sectos.id 
WHERE house = 
$house AND name = '$street'   "
$result3=mysql_query($query3) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error().""); 
$row3 mysql_fetch_array($result3); 
echo 
$row3['img']; 

   
 
 автор: kis-kis   (03.04.2007 в 15:42)   письмо автору
 
   для: Trianon   (03.04.2007 в 15:15)
 

Код не работает...
Рисунок мы берем из таблицы map_sectors, а у вас из map_streets...
Может вы зададите вопросы что Вам не понятно, а я отвечу. Возможно так прояснится ситуация... ))

   
 
 автор: Trianon   (03.04.2007 в 16:11)   письмо автору
 
   для: kis-kis   (03.04.2007 в 15:42)
 

>Код не работает...
Во второй строке запросе я опечатался. Пропустил букву r в имени map_sectors
Код работает. У меня во всяком случае.

>Рисунок мы берем из таблицы map_sectors, а у вас из map_streets...
Рисунок мы берем из соединения всех трех таблиц.

>Может вы зададите вопросы что Вам не понятно, а я отвечу. Возможно так прояснится ситуация... ))
Впечатление такое, что я пропустил момент подписания контракта.

   
 
 автор: kis-kis   (03.04.2007 в 16:25)   письмо автору
 
   для: Trianon   (03.04.2007 в 16:11)
 

А каким образом вы определяете какая была улица? Я имею ввиду поисковый запрос. Какой переменной вы его передаете?

   
 
 автор: Trianon   (03.04.2007 в 16:32)   письмо автору
 
   для: kis-kis   (03.04.2007 в 16:25)
 

Вот полный тест:

<?php include('config.inc.php');
$street 'бульвар Строителей'$house 1;
$query3 "SELECT img
FROM map_streets JOIN map_search ON map_streets.id = map_search.street
JOIN map_sectors ON image=map_sectors.id
WHERE house = 
$house AND name = '$street'   ";
$result3=mysql_query($query3) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
$row3 mysql_fetch_array($result3);
echo 
$row3['img'];
?>

   
Rambler's Top100
вверх

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