SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.12.2010 11:10:30

Deads
Участник
Зарегистрирован: 08.12.2010
Сообщений: 3

Помогите оптимизировать запрос


SELECT `optimization_keywords`.keyword, `optimization_keywords`.proj_id, `optimization_keywords`.opt_id, `optimization_keywords`.key_id,
            `t0`.`meta` as pos0, `t1`.`meta` as pos1,
            `t2`.status as projectstatus, `optimization_keywords`.status as keywordstatus,
            `t3`.`lastsend` as lastsend, `t3`.`lastmanual` as lastmanual
            FROM (`optimization_keywords` , `optimization_words_test`, `optimization_projects`)
            LEFT JOIN `optimization_stats_new` as `t0` ON (`optimization_keywords`.`proj_id`=`t0`.`proj_id` AND `optimization_keywords`.`opt_id`=`t0`.`opt_id` AND `t0`.`date`='$dateTodayTImestampt' AND `t0`.`key_id`=`optimization_keywords`.`key_id`)
            LEFT JOIN `optimization_stats_new` as `t1` ON (`optimization_keywords`.`proj_id`=`t1`.`proj_id` AND `optimization_keywords`.`opt_id`=`t1`.`opt_id` AND `t1`.`date`='$dateYesterdayTimestampt' AND `t1`.`key_id`=`optimization_keywords`.`key_id`)
            LEFT JOIN `optimization_projects` as `t2` ON (`optimization_keywords`.`proj_id`=`t2`.`id`)
            LEFT JOIN `optimization_projects_timer` as `t3` ON (`optimization_keywords`.`proj_id`=`t3`.site AND `optimization_keywords`.`opt_id`=`t3`.`opt_id` AND `t3`.searchEngine='meta')
            WHERE `optimization_words_test`.`wordname` = `optimization_keywords`.keyword AND `optimization_words_test`.`system`='meta' AND `optimization_projects`.`meta`='1' AND `optimization_projects`.`id` = `optimization_keywords`.`proj_id`
            GROUP BY keyword
 



CREATE TABLE IF NOT EXISTS `optimization_words_test` (
  `id` int(3) NOT NULL AUTO_INCREMENT,
  `wordname` tinytext CHARACTER SET cp1251 COLLATE cp1251_general_cs NOT NULL,
  `system` enum('meta','msn','yandex') NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=28 ;
 



CREATE TABLE `optimization_keywords` (
  `key_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `opt_id` int(10) unsigned NOT NULL,
  `proj_id` int(10) unsigned NOT NULL,
  `keyword` char(100) COLLATE cp1251_general_cs NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `order` int(3) NOT NULL,
  `freq_query` int(10) unsigned NOT NULL,
  `date_check_freq` int(11) unsigned NOT NULL,
  `isgeo` tinyint(1) unsigned NOT NULL,
  `date_geo` int(10) unsigned NOT NULL,
  PRIMARY KEY (`key_id`),
  UNIQUE KEY `opt_id` (`proj_id`,`opt_id`,`keyword`),
  KEY `status` (`status`),
  KEY `date_geo` (`date_geo`),
  KEY `date_check_freq` (`date_check_freq`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs AUTO_INCREMENT=246364;
 


Помогите оптимизировать запрос.

Неактивен

 

#2 08.12.2010 13:22:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите оптимизировать запрос

А волшебное слово? smile

1. Зачем объединения левые?
2. Где EXPLAIN?
3. Где структура остальных таблиц?
4. Почему не попробовали сделать самостоятельно? smile

Неактивен

 

#3 09.12.2010 10:55:09

Deads
Участник
Зарегистрирован: 08.12.2010
Сообщений: 3

Re: Помогите оптимизировать запрос

Уже попробовал, оптимизировал структуру таблицы, спасибо.
Хотел бы задать ещё один вопрос.


SELECT `optimization_keywords`.proj_id, `optimization_keywords`.opt_id, `optimization_keywords`.key_id,
                    `optimization_projects_timer`.`lastsend`
             FROM (`optimization_keywords`, `optimization_projects`, `optimization_projects_timer`)
             WHERE `optimization_keywords`.keyword='$wordname' AND `optimization_projects`.`$system`='1' AND `optimization_projects`.`id` = `optimization_keywords`.`proj_id`
AND `optimization_words_test`.`proj_id`=`optimization_projects_timer`.site AND `optimization_words_test`.`opt_id`=`optimization_projects_timer`.`opt_id` AND `optimization_projects_timer`.searchEngine='yandex'
             ORDER BY `optimization_projects_timer`.`lastsend` DESC
             LIMIT 1
 


Здесь есть конструкция ORDER BY `optimization_projects_timer`.`lastsend` DESC. Но мне нужно выполнять Ордер бай над максимальным значением из полей  `optimization_projects_timer`.`lastsend` либо  `optimization_projects_timer`.`lastmanual`. Как тогда правильней будет переписать ORDER BY.
Помогите пожалуйста.

Отредактированно Deads (09.12.2010 11:09:01)

Неактивен

 

#4 09.12.2010 12:23:25

Deads
Участник
Зарегистрирован: 08.12.2010
Сообщений: 3

Re: Помогите оптимизировать запрос

Попробовал так:


             SELECT `optimization_keywords`.proj_id, `optimization_keywords`.opt_id, `optimization_keywords`.key_id,
                    if(MAX(`optimization_projects_timer`.`lastsend`) > MAX(`optimization_projects_timer`.`lastmanual`), MAX(`optimization_projects_timer`.`lastsend`), MAX(`optimization_projects_timer`.`lastmanual`)) AS mymax
             FROM (`optimization_keywords`, `optimization_projects`, `optimization_projects_timer`)
             WHERE `optimization_keywords`.keyword='$wordname' AND `optimization_projects`.`$system`='1' AND `optimization_projects`.`id` = `optimization_keywords`.`proj_id`
             AND `optimization_keywords`.`proj_id`=`optimization_projects_timer`.site AND `optimization_keywords`.`opt_id`=`optimization_projects_timer`.`opt_id` AND `optimization_projects_timer`.searchEngine='$system2'
             ORDER BY mymax DESC
             LIMIT 1
 


Но получил ошибку:
Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Отредактированно Deads (09.12.2010 12:24:30)

Неактивен

 

#5 09.12.2010 19:24:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите оптимизировать запрос

MySQL абсолютно прав. В таблице может быть только одно максимальное значение,
если Вы не группируете данные. Сортировать по одной строке по крайней мере странно
(если не сказать, что бессмысленно).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson