Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Помогите построить запрос MYSQL (Сергей) 29/09/2008 - 17:08:46
      Re: Помогите построить запрос MYSQL (Антон) 29/09/2008 - 17:35:59
      Re: Помогите построить запрос MYSQL (bac) 30/09/2008 - 01:18:32

> Original message text:
> From: Сергей - 29/09/2008 - 17:08:46
> Subject:Помогите построить запрос MYSQL
> -----------------
> Хостер отключил сайт за перегруз базы данных.
> Сам я программист PHP. Но сейчас столкнулся с проблемой в MYSQL.
> Требуется проконсультировать по очень проблемному
> запросу.
>
> Есть две таблицы pictures и categories.
> В первой 3500 записей, во второй около 30.
>
> Делается запрос картинки, плюс сразу же
> предыдущей и следующей из этой же категории.
>
> И того, хостер говорит, что просматривается более
> 100 ТЫСЯЧ строк. И отключил меня.
>
>
> ВОТ САМА ПРОБЛЕМА
>
> Проблемный запрос
>
> Время исполнения, секунд - 15
> Кол-во просмотренных строк - 189104
> Запрос:
> -------
> use 1gb_supertest4;
> SELECT P.*, max(Prev.id_pic) as prev, min(Next.id_pic) as next FROM
> pictures P
> LEFT JOIN pictures Prev on (Prev.category_ind=P.category_ind
> and Prev.id_pic<P.id_pic)
> LEFT JOIN pictures Next on (Next.category_ind=P.category_ind
> and Next.id_pic>P.id_pic)
> WHERE P.id_pic='4154' GROUP BY P.category_ind;
>
>
>
> Структура таблиц
>
> CREATE TABLE `categories` (
> `category_ind` int(11) NOT NULL auto_increment,
> `category_name` varchar(30) NOT NULL default '',
> `category_title` varchar(30) NOT NULL default '',
> `category_desc` text NOT NULL,
> `num` int(16) default '0',
> `loads` int(16) default '0',
> PRIMARY KEY (`category_ind`)
> )
>
>
> CREATE TABLE `pictures` (
> `id_pic` int(11) NOT NULL auto_increment,
> `category_ind` int(11) NOT NULL default '0',
> `category_name` varchar(30) NOT NULL default '',
> `file_name` varchar(30) NOT NULL default '',
> `name_pic` varchar(30) NOT NULL default '',
> `description` text NOT NULL,
> `added_by` varchar(30) NOT NULL default '',
> `type` int(11) NOT NULL default '0',
> `loads` int(16) default '0',
> `total_loads` int(11) NOT NULL default '0',
> `time` int(11) NOT NULL default '0',
> PRIMARY KEY (`id_pic`),
> KEY `category_ind` (`category_ind`),
> KEY `type` (`type`),
> KEY `added_by` (`added_by`)
> )
>
>


From: Антон - 29/09/2008 - 17:35:59
Subject:Помогите построить запрос MYSQL
-----------------
Конечно так оно все и есть. Здесь необходимо ограничивать таблицы Prev и Next. Как подсказывает мне мой опыт проблема в двойном условии в LEFT JOIN.
Я бы сделал с подзапросами типа
SELECT * FROM `pictures` P LEFT JOIN
(SELECT * FROM `pictures` P1 WHERE P1.`id_pic` < P.`id_pic`) Prev ON (Prev.`category_ind` = P.`category_ind`) LEFT JOIN
(SELECT * FROM `pictures` P2 WHERE P2.`id_pic` > P.`id_pic`) Next ON (Next.`category_ind` = P.`category_ind`)


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
34187



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |