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




MySQL.RU - Webboard



Вернуться
Вот такой вот запрос. Помогите оптимизировать (Слава) 28/09/2011 - 01:18:47
      Re: Структуру таблиц в студию (Akina) 28/09/2011 - 09:22:07
      Re: Структуру таблиц в студию (Слава) 28/09/2011 - 10:43:29
      Re: А как картинку с EXPLAIN сюда ? (Слава) 28/09/2011 - 10:47:13
      Re: explain (Слава) 28/09/2011 - 10:51:44
      Re: explain (Akina) 28/09/2011 - 15:32:52
      Re: explain (Слава) 28/09/2011 - 19:31:34
      Re: explain (Akina) 29/09/2011 - 08:59:13
      Re: explain (Слава) 29/09/2011 - 10:02:15
      Re: explain (Akina) 29/09/2011 - 12:26:55
      Re: переписал запрос вот он и его explain (Слава) 29/09/2011 - 21:24:28
      Re: переписал запрос вот он и его explain (Akina) 30/09/2011 - 08:57:26
      Re: переписал запрос вот он и его explain (Слава) 30/09/2011 - 10:22:09
      Re: Как быть (Akina) 30/09/2011 - 10:43:18

> Original message text:
> From: Слава - 28/09/2011 - 01:18:47
> Subject:Вот такой вот запрос. Помогите оптимизировать
> -----------------
> SELECT
> user_id, resultat, times, login, nickname, title, cms_users.id
> , DATE_FORMAT(`pubdate`, '%d.%m.%Y - %H:%i') AS `kogda`
> FROM cms_games_scores s1
> LEFT JOIN `cms_games_turnir` t ON `t`.`id`='".$zapros."'
> LEFT JOIN `cms_users` u ON `u`.`id`=`s1`.`user_id`
> WHERE resultat=(SELECT MAX(s2.resultat)
> FROM cms_games_scores s2
> WHERE s1.user_id = s2.user_id
> AND `turnir`='".$zapros."')
> ORDER BY `resultat`
> DESC
>


From: Akina - 30/09/2011 - 10:43:18
Subject:Как быть
-----------------
Классическое решение - в подзапросе получаем минимальный набор полей, позволяющи идентифицировать конкретную запись. Т.е. только тех полей, которые используются либо в агрегатных функциях, либо в группировке. После чего к полученной выборке по значениям полей линкуем исходные таблицы, забирая из них необходимые нам данные.

Применительно к Вашему запросу - группируете Вы по `s`.`user_id`, агрегируете `s`.`resultat`. Значит, подзапрос будет

SELECT
MAX(`s`.`resultat`) `res`
, `s`.`user_id`
FROM `cms_games_scores` `s`
GROUP BY `s`.`user_id`;

Соответственно полученная пара полей должна идентифицировать ту конкретную строку из группы строк для каждого отдельного значения `s`.`user_id`, из которой нужно брать `s`.`times` и к которой следует привязывать все остальные таблицы.

Правда, и тут не без пакости - в таблице запросто может оказаться несколько строк, содержащих полученные в подзапросе значения. Конечно, от дублирования можно избавиться distinct-ом внешнего запроса, но если и в нём будут агрегатки типа SUM или COUNT, то уже они будут врать.


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

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

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



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