PHP уроки
ПРОСТО самая лучшая обучалка PHP!
  • Студия LPHPRU
  • Уроки PHP
  • Контакты
  • Помощь
Меню
  • PHP - с чего начать?
  • Уроки PHP
  • Функции PHP
  • Массивы
  • Denwer
  • MySQL
  • Информация
  • Dreamweaver уроки
  • JQuery уроки
Календарь
Июнь (2023)
ПнВтСрЧтПтСбВс
   1234
567891011
12131415161718
19202122232425
2627282930  

  • Что нового?

    • Тест №2
    • Тест №1 для разработчиков
    • PHP 5.6 RC1
    • SQL. Как cкопировать данные одной колонки в другую, в той же таблице
    • GRUB изменить порядок загрузки OS в Linux
    • SSH - вход на сервер без ввода пароля
    • PhpMyAdmin - проблема с загрузкой большого файла на сервер
  • Комментарии

    • тут нечего не понятно
    • Может уже пора на WebStorm переходит�...
    • Здравствуйте. 10 лет пользуюсь др�...
    • Была такая проблема, решалась пе�...
    • Возможно с течением времени этот...
  • TOP-5

    • Метод POST (2946432 )
    • Привет, МИР! (911226 )
    • Метод GET (667805 )
    • Операторы (606044 )
    • Firefox уже запущен, но не отвечает... (353682 )

Как выбрать все товары из базы данных, принадлежащие одной категории?

Главная» Array » Как выбрать все товары из базы данных, принадлежащие одной категории?
PHP урок № 264
Выборка данных из MySQL
Условие:
1. есть товары: скакалки, гантели, боксерские перчатки, штанги, велотренажеры, капы, футбольные мячи и т.д.
2. есть категории: фитнес, бокс, велоспорт, футбол, мячи и сетки и т.д.
3. Некоторые товары принадлежат сразу к нескольким категориям (футбольный мяч принадлежит к категории "футбол" и к категории "мячи и сетки").
Вопрос:
Как сделать так, чтобы при выборе категории товаров на странице выводились все товары? Т.е. меня интересует что для этого нужно сделать? Каким образом (по какому принципу) создавать таблицы в БД? Как объединять (нужно ли объединять)? Как сформулировать запрос в БД?
Ответ:
Немного о сущностях, так называются объекты которые помещаются в базу данных в виде таблиц. Объект это существительное. Это люди, местность, событие, предмет, всё то о чём вы будете хранить данные в БД. Для того чтобы определить объект для базы данных, попробуйте ответить на два вопроса:
Их больше одного? Вы можете представить больше одного представителя данного объекта?
  • Он изменяется со временем? Кол-во членов растёт или уменьшается? Кол-во посещений меняется со временем?
  • Если ответ положительный, следует создать для этого объекта отдельную таблицу в базе данных.
    По условию задачи мы имеем несколько категорий и несколько товаров. Все категории можно объединить в одну таблицу categors. C товарами немного посложнее каждый товар по сути есть сущность, мяч может быть не только не один в прайсе, но и разновидность мячей так же имеет место быть. Поэтому для сущности мяч, создаём отдельную таблицу machs, в которую и будем помещать все мячи (волейбольные, баскетбольные, футбольные). К тому же по условию задачи, мяч может принадлежать к разным категориям. Для этого сделаем ассоциативную таблицу, между связью categors и machs. Назовём её tovars.
    Я не буду сейчас расписывать все категории. Думаю и так понятно по аналогии, как создать для каждого товара, который будет встречаться в разных категориях, дополнительные таблицы. Возьмём пример ещё одного товара, который не входит в несколько категорий, пусть это будет товар сетки, Создаём для этой сущности таблицу setkas. В результате всего выше изложенного у нас получилось четыре таблицы. Ниже представлена ER-диаграмма.
    Рис. 1
    Листинг № Array - Дамп БД
    -- --------------------------------------------------------

    --
    -- Структура таблицы `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);
    Листинг № Array - Выборка всех товаров по категории.
    <?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 в БД. Здесь вы так же увидите футбольный мяч.
    Урок закончен.
    SETTER © LPHP.RU
    Администрация сайта
    Array
    Обсудить на форуме.
    • lphp.ru © 2009-2023