[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 "%одеж%"
)
Результат запроса:
| name | kindeq |
| Терра у Горьковской | туристическая одежда |
| Терра у Лесной | туристическая одежда |
"%одеж%" - это безобразие символизирует кусок названия вида снаряжения, введенного в форме ввода.