Наше прошлое 20072009201120132014
г. Москва, ул. Гостиничная, д. 7А. кор.2
8 (499) 404-26-56
пн-пт 11:00 - 19:00
 

Вложенные запросы MySQL

При разработке сайтов очень часто появляется необходимость брать информацию не с одной таблички, а с нескольких. Можно конечно сделать несколько запросов к базе данных, но в некоторых случаях это будет очень сложно, а в некоторых не очень удобно. Да и если делать множество запросов, особенно в крупных порталах, то стоимость разработки сайта может сильно увеличиться, а качество и скорость работы понизиться.

В этом уроке мы познакомимся с вложенными запросами 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/>"; //Выводим категории на экран
}
?>

Скачать исходник

При разработке сайтов очень часто появляется необходимость брать информацию не с одной таблички, а с нескольких. Можно конечно сделать несколько запросов к базе данных, но в некоторых случаях это будет очень сложно, а в некоторых не очень удобно. Да и если делать множество запросов, особенно в крупных порталах, то стоимость разработки сайта может сильно увеличиться, а качество и скорость работы понизиться.

Комментарии

Нет комментариев

Заполните все поля

Написать комментарий

Ваше имя

Комментарий