При разработке сайтов очень часто появляется необходимость брать информацию не с одной таблички, а с нескольких. Можно конечно сделать несколько запросов к базе данных, но в некоторых случаях это будет очень сложно, а в некоторых не очень удобно. Да и если делать множество запросов, особенно в крупных порталах, то стоимость разработки сайта может сильно увеличиться, а качество и скорость работы понизиться.
В этом уроке мы познакомимся с вложенными запросами mysql, на примере разработки меню для сайта. В нашем примере будет выводиться имена разделов меню, и в скобках количество страниц относящихся к каждому разделу. То есть будет 2 таблички, category, и page. В табличке category будут храниться разделы меню, в разделе page - страницы.
Табличка category | Табличка page |
Наша задача одним SQL-запросом, взять информацию из 2-ух табличек, и вывести на экран следующим образом (имя раздела [кол-во статей в нем]):
Для начала рассмотрим сам запрос, потом пример.
SELECT (SELECT COUNT(*) FROM `page` WHERE page.category_id = category.id) as `count`, category.name FROM category
То есть мы выполняем запрос на получения всех категорий (SELECT category.name FROM category), и внутри него делаем выборку на получение количества страниц для каждой категории ((SELECT COUNT(*) FROM `page` WHERE page.category_id = category.id) as `count`).
Пример
Вот дамп MySQL базы:
CREATE DATABASE `ox2.ru-test-base` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci; USE `ox2.ru-test-base`; -- -- Структура таблицы `category` -- CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ; -- -- Дамп данных таблицы `category` -- INSERT INTO `category` (`id`, `name`) VALUES (1, 'Уроки PHP'), (2, 'Уроки JS'); -- -------------------------------------------------------- -- -- Структура таблицы `page` -- CREATE TABLE IF NOT EXISTS `page` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `text` text, `category_id` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `category_id` (`category_id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=6 ; -- -- Дамп данных таблицы `page` -- INSERT INTO `page` (`id`, `name`, `text`, `category_id`) VALUES (1, 'Урок 1 - Первая программа (скрипт) на PHP', 'Текст урокаrn...', 1), (2, 'Урок 2 - Переменные в PHP', 'Текст урокаrn...', 1), (3, 'Урок 3 - Массивы в PHP', 'Текст урокаrn...', 1), (4, 'Урок 1 - Первая программа (скрипт) на JavaScript', 'Текст урокаrn...', 2), (5, 'Урок 2 - Выводим сообщения на JavaScript', 'Текст урокаrn...', 2);
<?php /** * Вложенные запросы MySQL * @author ox2.ru */ class Request { private $_db = null; public function __construct() { //Подключаемся к базе данных, и записываем подключение в переменную _db $this->_db = new PDO("mysql:dbname=ox2.ru-test-base;host=localhost", "root", ""); } /** * Возвращает список категорий и кол-во страниц в каждой категории */ public function getCategory() { $query = $this->_db->prepare("SELECT (SELECT COUNT(*) FROM `page` WHERE page.category_id = category.id) as `count`, category.name FROM category"); //Выполняем вложенные запрос к базе данных $query->execute(); return $query->fetchAll(PDO::FETCH_OBJ); //Возвращаем выборку из базы } } $request = new Request(); $category_arr = $request->getCategory(); foreach ($category_arr as $category) { //Обходим список категорий echo $category->name . " [" . $category->count . "] <br/>"; //Выводим категории на экран } ?>
Комментарии
Заполните все поля
Написать комментарий