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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MySql] Достать 5 строк с наибольшим значениями 
:(
    Опции темы
kichSman
Дата 24.3.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помогите составить запрос, чтобы можно было достать пять строк таблицы, у которых наибольшее значение одного столбца. Смотрел мануал, наперся на пример, который не очень удовлетворяет моей необходимости, так как получение этих строк реализуют через сортировку базы, а хотелось бы по вложенным запросам
PM MAIL   Вверх
Akina
Дата 24.3.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

Select ChoiceColumn, OtherColumns
From SomeTable
Order By ChoiceColumn Desc
Limit RowsCount



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

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


Шустрый
*


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

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



Цитата(Akina @ 24.3.2009,  15:39)
Код

Select ChoiceColumn, OtherColumns
From SomeTable
Order By ChoiceColumn Desc
Limit RowsCount

яж грю, что нужно без сортировки
PM MAIL   Вверх
Akina
Дата 24.3.2009, 16:22 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ну кто мешает? 
Первый запрос (на основе таблицы) выбирает max...
Второй запрос (на основе таблицы и первого запроса) выбирает max из оставшихся...
Третий запрос (на основе таблицы и первых двух запросов) выбирает очередной max...
...
Итого 5 запросов. А потом всем им UNION.

Вот только писАть этого урода пусть тебе кто-нить другой помогает...


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

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


Шустрый
*


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

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



Цитата(Akina @ 24.3.2009,  16:22)
Вот только писАть этого урода пусть тебе кто-нить другой помогает...

Мля, улыбнулу!!! smile 
PM MAIL   Вверх
Akina
Дата 24.3.2009, 17:05 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

PS. А это часом не домашнее задание? уж больно постановка задачи идиотская...


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

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


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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



Код

SELECT *
FROM Table AS A
WHERE
(
    SELECT COUNT(B.a) AS a 
    FROM Table AS B
        WHERE B.a>A.a        
)<=5



--------------------
Слава Україні!
PM MAIL   Вверх
Zloxa
Дата 25.3.2009, 10:17 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(Akina @  24.3.2009,  16:22 Найти цитируемый пост)
Итого 5 запросов. А потом всем им UNION.


Цитата(Gluttton @  24.3.2009,  17:08 Найти цитируемый пост)
WHERE B.a>A.a    

И кто поручится за то что будут возвращены не более пяти записей?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 25.3.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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



To Zloxa

Цитата

И кто поручится за то что будут возвращены не более пяти записей?


Цитата

)<=5



--------------------
Слава Україні!
PM MAIL   Вверх
Zloxa
Дата 25.3.2009, 10:38 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(Gluttton @  25.3.2009,  10:27 Найти цитируемый пост)
)<=5

Код

SQL> with t as(select 1 a from dual
  2            union all select 2 from dual
  3            union all select 2 from dual
  4            union all select 2 from dual
  5            union all select 2 from dual
  6            union all select 2 from dual
  7            union all select 2 from dual)
  8  SELECT *
  9  FROM t A
 10  WHERE
 11  (
 12      SELECT COUNT(B.a) AS a
 13      FROM t B
 14          WHERE B.a>A.a
 15  )<=5
 16  ;
 
         A
----------
         2
         2
         2
         2
         2
         2
 
6 rows selected
 



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 25.3.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(kichSman @  24.3.2009,  15:32 Найти цитируемый пост)
не очень удовлетворяет моей необходимости, так как получение этих строк реализуют через сортировку базы, а хотелось бы по вложенным запросам 

Еще одна попытка управлять автомобилем не используя руля.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 25.3.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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



To Zloxa

С замечанием в целом согласен, но при существующей постановке задачи, я думаю на приведенном Вами наборе тестовых значений нет способа вернуть 5 строк.
Для того что бы "развязывать" варианты с одинаковыми значениями необходимо выбрать одну из стратегий, либо нам нужны, так сказать, пять наибольших вариантов (тогда используем DISTINCT) или же необходимо использовать дополнительное поле для уточнения критерия выбора, например "дата занесения в таблицу" и тогда формулировка будет такая: "Определить 5 самых больших значений поля а, для одинаковых значений выводить в первую очередь те которые были занесены раньше".

Способ приведеный мною выше может быть с лёгкостью  smile  адаптирован как под первый так и под второй вариант (с особо ощутимой легкостью под второй вариант  smile ).

Код

/* Первый вариант */
SELECT *
FROM Table AS A
WHERE
(
    SELECT COUNT(DISTINCT B.a) AS a 
    FROM Table AS B
        WHERE B.a>A.a        
)<=5


Код

/* Второй вариант
Здраствуйте я "Крокодил Гена". :) */
SELECT
CASE
    WHEN 
    (
       /* Если в сумме количество элементов */
       SELECT SUM(S.a)
       FROM
       (
           /* которые больше данного */
           SELECT COUNT(AA.a) AS a
           FROM Table AS AA
               WHERE
               (
                   SELECT COUNT(BB.a) AS a
                   FROM Table AS BB
                   WHERE BB.a>AA.a
               )<=5
               AND AA.a>A.a
           UNION ALL
           /* а так же одинаковые значения, но с большим полем b*/
           SELECT COUNT(AA.a) AS A
           FROM Table AS AA
               WHERE
               (
                   SELECT COUNT(BB.a) AS a
                   FROM Table AS BB
                   WHERE BB.a>AA.a
               )<=5
               AND AA.a=A.a
               AND AA.b>A.b       
       )   AS S 
    )<5
    THEN
        A.a
END AS a,
FROM Table AS A
WHERE
(
    SELECT COUNT(B.a) AS a 
    FROM Table AS B
        WHERE B.a>A.a        
)<=5




--------------------
Слава Україні!
PM MAIL   Вверх
Zloxa
Дата 26.3.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(Gluttton @  25.3.2009,  19:07 Найти цитируемый пост)
выбрать одну из стратегий

ИМХО ты бежишь впереди паровоза. Топикстартер не соизволил объяснить, чем его пугает прямой путь (необходимость сортировки), а ты через хрустальный шар во всю гадаешь, стратегии обхода измышляешь.  smile 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
kichSman
Дата 26.3.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Zloxa @ 26.3.2009,  11:06)
Цитата(Gluttton @  25.3.2009,  19:07 Найти цитируемый пост)
выбрать одну из стратегий

...Топикстартер не соизволил объяснить, чем его пугает прямой путь (необходимость сортировки), а ты через хрустальный шар во всю гадаешь, стратегии обхода измышляешь.  smile

Слежу за ходом логики.
А необходимость банальная - экономия оперативы
PM MAIL   Вверх
Akina
Дата 26.3.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(kichSman @  26.3.2009,  12:51 Найти цитируемый пост)
А необходимость банальная - экономия оперативы 

чо?  smile 


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

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


 




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


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

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