Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация нескольких запросов, Нужно показать некую статистику...  
:(
    Опции темы
YAAP
Дата 11.4.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 12.9.2007

Репутация: нет
Всего: нет



Привет. Мне нужно было показать статистику заипсей в таблице. Я в принципе сделал... но понимаю, не ооочень неоптимально. Там всего 4 видов статистики - все выборки из одной таблици, а я все ровно 5 раз перебираю все варианты.. из-за чего вся обработка оочень долгая..

Заарнее спасибо.


Таблица : 
Код

CREATE TABLE `sb_mod_shop_goods_copy` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `cat_id` bigint(20) NOT NULL DEFAULT '0',
  `title` varchar(255) NOT NULL,
  `full_descr` text,  
  `hidden` tinyint(4) NOT NULL DEFAULT '0',
  `checked` tinyint(4) NOT NULL DEFAULT '0',
  `goodimage` varchar(2) DEFAULT NULL,
  `isbnhide` binary(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `cat_id` (`cat_id`),
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=88114 ;


Таблица с категориями :
Код

CREATE TABLE `sb_mod_shop_categories` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `left_id` bigint(20) NOT NULL DEFAULT '0',
  `right_id` bigint(20) NOT NULL DEFAULT '0',
  `level` int(11) NOT NULL DEFAULT '0',
  `title` varchar(255) COLLATE cp1251_ukrainian_ci NOT NULL,
  `description` text COLLATE cp1251_ukrainian_ci,
  `keywords` text COLLATE cp1251_ukrainian_ci,
  PRIMARY KEY (`id`),
  KEY `left_id` (`left_id`,`right_id`,`level`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_ukrainian_ci AUTO_INCREMENT=677 ;




Таблица с авторами :
Код

CREATE TABLE `sb_mod_shop_authors` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `surname` varchar(255) NOT NULL,
  `info` text,
  `comments_count` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  FULLTEXT KEY `name` (`name`,`surname`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=39807 ;



Еще надо сказать, что отношение между книгами и авторами - мэни ту мэни =)
Поетому есть еще одна табличка связи:
Код

CREATE TABLE `sb_mod_shop_goods_authors` (
  `goods_id` bigint(20) NOT NULL,
  `author_id` bigint(20) NOT NULL,
  PRIMARY KEY (`goods_id`,`author_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;




Ну и собственно запросы, которые я пишу :
1) Выборка общего количества книг :
Код

SELECT count(id)  from sb_mod_shop_goods as R where R.cat_id in (SELECT id FROM sb_mod_shop_categories WHERE `left_id` >=".$myrow['left_id']." AND `right_id` <=".$myrow['right_id']." ORDER BY `left_id`)

2) Выборка видимых книг
Код

SELECT count(id)  from sb_mod_shop_goods as R where hidden=0 and R.cat_id in (SELECT id FROM sb_mod_shop_categories WHERE `left_id` >=".$myrow['left_id']." AND `right_id` <=".$myrow['right_id']." ORDER BY `left_id`)

3) Книги с описанием и автором
Код

SELECT count(id)  from sb_mod_shop_goods as R where R.id in (select goods_id from sb_mod_shop_goods_authors ) and (R.full_descr is not null or R.full_descr='') and (R.title is not null or R.title='')  and R.cat_id in (SELECT id FROM sb_mod_shop_categories WHERE `left_id` >=".$myrow['left_id']." AND `right_id` <=".$myrow['right_id']." ORDER BY `left_id`)


4) Без автора\видимые
Код

/*без автора*/
SELECT count(id)  from sb_mod_shop_goods as R where R.id not in (select goods_id from sb_mod_shop_goods_authors ) and R.cat_id in (SELECT id FROM sb_mod_shop_categories WHERE `left_id` >=".$myrow['left_id']." AND `right_id` <=".$myrow['right_id']." ORDER BY `left_id`)

/*видимые*/
SELECT count(id)  from sb_mod_shop_goods as R where R.id not in (select goods_id from sb_mod_shop_goods_authors ) and R.cat_id in (SELECT id FROM sb_mod_shop_categories WHERE `left_id` >=".$myrow['left_id']." AND `right_id` <=".$myrow['right_id']." ORDER BY `left_id`) and R.hidden=0


Добавлю, что код 
Код
SELECT id FROM sb_mod_shop_categories WHERE `left_id` >=".$myrow['left_id']." AND `right_id` <=".$myrow['right_id']." ORDER BY `left_id`
 выбирает ид категории книги, и всех ее вложеных податегорий.


Есил у кого-то будут какие предложения, может кто ткнет в меня чем-то, чтоб я поумнел - буду признателен.

PM MAIL   Вверх
Akina
Дата 11.4.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



не понял - какой смысл в left_id и right_id... почему нельзя использовать одно поле категории


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
YAAP
Дата 11.4.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 12.9.2007

Репутация: нет
Всего: нет



Цитата(Akina @ 11.4.2008,  10:48)
не понял - какой смысл в left_id и right_id... почему нельзя использовать одно поле категории

Так организованы категории\подкатегории в достаточно больших инет магазинах.
Почитать можно тут : http://www.getinfo.ru/article610.html

Одно поле категории нельзя использовать потому, что выборку надо делать не только по категории, но и по всем ее вложеным подкатегориям...
PM MAIL   Вверх
Akina
Дата 11.4.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Ну тады эта... во всех абсолютно запросах у тебя присутствует один и тот же подзапрос. Руки чешутся превратить его в отдельный вьюв или хранимку. Передаем туда пару параметров, и достаточно, пусть работает.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
YAAP
Дата 11.4.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 12.9.2007

Репутация: нет
Всего: нет



Ты хочешь сказать, запихнуть результат запроса в кой-то массив и работать с ним на уровне программирования а не sql запросов ?

Если я не так понял, то приведи пример плз
PM MAIL   Вверх
Akina
Дата 11.4.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



нет... я про CREATE PROCEDURE

Цитата(http://dev.mysql.com/doc/ @  MySQL Reference Manual)

9.3.2. Написание процедуры

На данный момент единственной документацией по этой теме является исходный код. 

Всю информацию о процедурах можно найти, изучив следующие файлы: 

sql/sql_analyse.cc 

sql/procedure.h 

sql/procedure.cc 

sql/sql_select.cc 





--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1024 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.