[28-10-2010] Джо

Ответ на вопрос к статье о проектировании реляционных БД

Моя статья о проектировании простейшей базы данных с января 2004 года была просмотрена почти 25000 раз и наконец принесла вполне резонный вопрос -

Olka:

Как организовывается связь многие-ко-многим понятно, а вот как создать запрос на выборку?

Ну вот, например, по запрашиваемому через поиск наименованию вида снаряжения вывести информацию о соответствующих магазинах... Как это делается что-то не доходит(

Поначалу я кинул какую-то отписку, но вдруг засвербило - надо бы ответить на вопрос по-взрослому - то есть, дать решение, а в букварях пусть девушка сама покопается. Человек, способный на хороший вопрос, способен на многое)

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

--

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

--

CREATE TABLE `shops` (

`id` int(11) NOT NULL default '0',

`name` varchar(50) NOT NULL default '',

`addr` varchar(100) NOT NULL default '',

`metro` varchar(30) NOT NULL default '',

`tel` varchar(15) NOT NULL default ''

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

--

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

--

INSERT INTO `shops` VALUES (1, 'Терра у Горьковской', 'Кронверкский пр, 31', 'Горьковская', '2336303');

INSERT INTO `shops` VALUES (2, 'Терра у Лесной', 'Парголовская ул, 7', 'Лесная', '2451290');

INSERT INTO `shops` VALUES (3, 'Снаряжение', 'Марата ул, 12', 'Маяковская', '3110760');

INSERT INTO `shops` VALUES (4, 'Снаряжение', 'Перекупной пер, 7/9', 'Площадь Александра Невского', '1107993');

--

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

--

CREATE TABLE `equips` (

`id` int(11) NOT NULL default '0',

`kindeq` varchar(30) NOT NULL default ''

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

--

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

--

INSERT INTO `equips` VALUES (1, 'туристическая одежда');

INSERT INTO `equips` VALUES (2, 'треккинговая обувь');

INSERT INTO `equips` VALUES (3, 'палатки');

INSERT INTO `equips` VALUES (4, 'рюкзаки');

INSERT INTO `equips` VALUES (5, 'спальники');

INSERT INTO `equips` VALUES (6, 'обвязки');

INSERT INTO `equips` VALUES (7, 'веревки');

--

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

--

CREATE TABLE `shopkindeq` (

`idshop` int(11) NOT NULL default '0',

`idkindeq` int(11) NOT NULL default '0'

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

--

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

--

INSERT INTO `shopkindeq` VALUES (1, 1);

INSERT INTO `shopkindeq` VALUES (1, 2);

INSERT INTO `shopkindeq` VALUES (2, 1);

INSERT INTO `shopkindeq` VALUES (2, 2);

Потом я задумался над запросом к получившейся базе и вот результат:

SELECT s.name, e.kindeq

FROM shops s

JOIN shopkindeq sk ON s.id = sk.idshop

JOIN equips e ON sk.idkindeq = e.id

WHERE e.id

IN (

SELECT id

FROM equips

WHERE kindeq LIKE "%одеж%"

)

Результат запроса:

namekindeq
Терра у Горьковскойтуристическая одежда
Терра у Леснойтуристическая одежда

"%одеж%" - это безобразие символизирует кусок названия вида снаряжения, введенного в форме ввода.

* - обязательно заполнить

Комментарий

*Имя

E-mail

*Код: 

*Текст комментария:

Самые популярные статьи