При разработке сайтов очень часто появляется необходимость брать информацию не с одной таблички, а с нескольких. Можно конечно сделать несколько запросов к базе данных, но в некоторых случаях это будет очень сложно, а в некоторых не очень удобно. Да и если делать множество запросов, особенно в крупных порталах, то стоимость разработки сайта может сильно увеличиться, а качество и скорость работы понизиться.
В этом уроке мы познакомимся с вложенными запросами 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/>"; //Выводим категории на экран
}
?>





Уроки по PHP
JavaScript
Уроки по HTML
Дизайнерам
СЕОшникам
Разное



Комментарии
Заполните все поля
Написать комментарий