- Подробности
-
Категория: PHP. Базы данных
Выборка данных из MySQL
Условие:
1. есть товары: скакалки, гантели, боксерские перчатки, штанги, велотренажеры, капы, футбольные мячи и т.д.
2. есть категории: фитнес, бокс, велоспорт, футбол, мячи и сетки и т.д.
3. Некоторые товары принадлежат сразу к нескольким категориям (футбольный мяч принадлежит к категории "футбол" и к категории "мячи и сетки").
Вопрос:
Как сделать так, чтобы при выборе категории товаров на странице выводились все товары? Т.е. меня интересует что для этого нужно сделать? Каким образом (по какому принципу) создавать таблицы в БД? Как объединять (нужно ли объединять)? Как сформулировать запрос в БД?
Ответ:
Немного о сущностях, так называются объекты которые помещаются в базу данных в виде таблиц. Объект это существительное. Это люди, местность, событие, предмет, всё то о чём вы будете хранить данные в БД. Для того чтобы определить объект для базы данных, попробуйте ответить на два вопроса:
Их больше одного? Вы можете представить больше одного представителя данного объекта?
Он изменяется со временем? Кол-во членов растёт или уменьшается? Кол-во посещений меняется со временем?
Если ответ положительный, следует создать для этого объекта отдельную таблицу в базе данных.
По условию задачи мы имеем несколько категорий и несколько товаров. Все категории можно объединить в одну таблицу categors. C товарами немного посложнее каждый товар по сути есть сущность, мяч может быть не только не один в прайсе, но и разновидность мячей так же имеет место быть. Поэтому для сущности мяч, создаём отдельную таблицу machs, в которую и будем помещать все мячи (волейбольные, баскетбольные, футбольные). К тому же по условию задачи, мяч может принадлежать к разным категориям. Для этого сделаем ассоциативную таблицу, между связью categors и machs. Назовём её tovars.
Я не буду сейчас расписывать все категории. Думаю и так понятно по аналогии, как создать для каждого товара, который будет встречаться в разных категориях, дополнительные таблицы. Возьмём пример ещё одного товара, который не входит в несколько категорий, пусть это будет товар сетки, Создаём для этой сущности таблицу setkas. В результате всего выше изложенного у нас получилось четыре таблицы. Ниже представлена ER-диаграмма.
Рис. 1
Листинг № 1 — Дамп БД
-- --------------------------------------------------------
--
-- Структура таблицы `categors`
--
CREATE TABLE `categors` (
`id_categor` int(4) unsigned NOT NULL auto_increment,
`categor` varchar(30) NOT NULL,
PRIMARY KEY (`id_categor`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;
--
-- Дамп данных таблицы `categors`
--
INSERT INTO `categors` VALUES (1, 'footbol');
INSERT INTO `categors` VALUES (2, 'bool_and_setka');
INSERT INTO `categors` VALUES (3, 'fitnes');
INSERT INTO `categors` VALUES (4, 'boks');
-- --------------------------------------------------------
--
-- Структура таблицы `machs`
--
CREATE TABLE `machs` (
`id_mach` int(6) unsigned NOT NULL auto_increment,
`mach` varchar(20) NOT NULL,
`razm` varchar(30) NOT NULL,
PRIMARY KEY (`id_mach`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=cp1251 COMMENT='мячи ' AUTO_INCREMENT=4 ;
--
-- Дамп данных таблицы `machs`
--
INSERT INTO `machs` VALUES (1, 'mach_footbol', '5');
INSERT INTO `machs` VALUES (2, 'mach_basketbool', '8');
INSERT INTO `machs` VALUES (3, 'mach_regby', '12');
-- --------------------------------------------------------
--
-- Структура таблицы `setkas`
--
CREATE TABLE `setkas` (
`id_setka` int(5) unsigned NOT NULL auto_increment,
`setka` varchar(25) NOT NULL,
`razm` varchar(25) NOT NULL,
`id_categor` int(5) NOT NULL,
PRIMARY KEY (`id_setka`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=cp1251 COMMENT='сетки' AUTO_INCREMENT=4 ;
--
-- Дамп данных таблицы `setkas`
--
INSERT INTO `setkas` VALUES (1, 'setka_volbol', '122', 2);
INSERT INTO `setkas` VALUES (2, 'setka_tenis', '18', 3);
INSERT INTO `setkas` VALUES (3, 'setka_footbol', '220', 1);
-- --------------------------------------------------------
--
-- Структура таблицы `tovars`
--
CREATE TABLE `tovars` (
`id_mach` int(5) NOT NULL,
`id_categor` int(5) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
--
-- Дамп данных таблицы `tovars`
--
INSERT INTO `tovars` VALUES (1, 2);
INSERT INTO `tovars` VALUES (1, 1);
Листинг № 2 — Выборка всех товаров по категории.
<?php
// ID запрашиваемой категории
$id_categor = 1;
$r = mysql_query("SELECT * FROM categors, setkas, tovars,
machs WHERE categors.id_categor = '".
$id_categor."' AND setkas.id_categor = '".
$id_categor."' AND tovars.id_categor = '".
$id_categor."' AND tovars.id_mach = machs.id_mach");
if(!$r)exit(mysql_error());
while($t = mysql_fetch_array($r))
{
echo "<strong>Товар по категории ". $t['categor'].
" :</strong> <br>" .
$t['mach'].";<br> " .$t['setka'].";<br>";
}
?>
В листинге №2, переменная $id_categor принимает значение 1, при этом выводятся товары принадлежащие к категории footbol, mach_footbol присутствует в двух категориях. Поменяйте значение переменной на 2, это категория bool_and_setka в БД. Здесь вы так же увидите футбольный мяч.