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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптимизация, оптимизация 
:(
    Опции темы
od0201
Дата 23.2.2013, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день, не хватает знаний сделать правильный запрос, помогите

поля дата, ID female, ID male, letter (первые 3 поля уникальный индекс)
выбрать все возможные пары мальчик-девочка с максимальной датой и письмо из этой записи
Код

SELECT  date,idf,idm,letter
FROM letters 
WHERE concat(date,idf,idm) in (SELECT concat(max( date ),idf,idm) FROM letters GROUP BY idf, idm)

работает правильно, в таблице 3 000 записей  и запрос выполняется  15 секунд

Спасибо
PM MAIL   Вверх
Arantir
Дата 23.2.2013, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Если правильно понимаю, то дата максимальная в масштабе всей таблицы.
Тогда этот запрос должен делать то же самое:
Код

SELECT date, idf, idm, letter FROM letters WHERE date = (SELECT max(date) FROM letters)


Добавлено через 3 минуты и 28 секунд
Все никак не могу вообразить, зачем вам там concat полей?


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
od0201
Дата 23.2.2013, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


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


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

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



Уберите конкатенацию, она не нужна:
Код

SELECT  date,idf,idm,letter
FROM letters 
WHERE (date,idf,idm) in (SELECT (max( date ),idf,idm) FROM letters GROUP BY idf, idm)

Если в индексе иной порядок полей - поменяйте их  порядок в индексе или в запросе.

Добавлено через 1 минуту и 2 секунды
И - оптимизация СУБД-зависима, задавать вопрос в общем разделе (и даже не указать СУБД) неразумно.


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

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


Шустрый
*


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

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



сорри, база MySQL

индекс задан в этом же порядке

но Ваш вариант (Akina) выдает ошибку #1241 - Operand should contain 1 column(s)
PM MAIL   Вверх
boevik
Дата 23.2.2013, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

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



Попробуй JOIN между запросами:
Код

SELECT  date,idf,idm,letter
FROM letters l JOIN (SELECT (max( date ) max_date,idf,idm) FROM letters GROUP BY idf, idm) t
on l.date = t.max_date and l.idf = t.idf and l.idm = t.idm 



--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
od0201
Дата 24.2.2013, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



немного исправлений и 
Код

SELECT  l.date,l.idf,l.idm,l.letter
FROM letters l JOIN (SELECT max( date ) max_date,idf,idm FROM letters GROUP BY idf, idm) t
on l.date = t.max_date and l.idf = t.idf and l.idm = t.idm 

все работает.
Спасибо boevik
PM MAIL   Вверх
Akina
Дата 24.2.2013, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(od0201 @  23.2.2013,  21:00 Найти цитируемый пост)
Ваш вариант (Akina) выдает ошибку #1241 - Operand should contain 1 column(s) 

попробуйте убрать скобки... я не помню, как правильно пишется многоколоночный where in


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

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


Шустрый
*


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

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



Цитата(Akina @ 24.2.2013,  13:42)
Цитата(od0201 @  23.2.2013,  21:00 Найти цитируемый пост)
Ваш вариант (Akina) выдает ошибку #1241 - Operand should contain 1 column(s) 

попробуйте убрать скобки... я не помню, как правильно пишется многоколоночный where in

без скобок тоже ничего путного не вышло...к тому же я "начитался" немного и люди советуют использовать вариант с JOIN вместо IN, он на порядок быстрее выполняется (по крайней мере в моем случае это так)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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