Mysql top 1: mysql — Select TOP 1 from the result set

Mysql group by limit — Dudom

Is there a simple way to LIMIT the GROUP BY results to the top 2. The following query returns all the results. Using ‘LIMIT 2’ reduces the overall list to the top 2 entries only.

Results in the following :-

As requested I have attached a copy of the table structure and some test data. My goal is to create a single view that has the top 2 results from each unique rating_name

3 Answers 3

I don’t think that there is a simple way in MySQL. One way to do this is by generating a row number for each row partitioned in groups by rating_name, and then only select the rows with row_number 2 or less. In most databases you could do this using something like:

Unfortunately, MySQL doesn’t support the ROW_NUMBER syntax. You can however simulate ROW_NUMBER using variables:

Result when run on your test data:

This is still possible via a single query, but it’s a bit long, and there are some caveats, which I’ll explain after the query. Though, they’re not flaws in the query so much as some ambiguity in what «top two» means.

Here’s the query:

The caveat is that if there is more than one id_market with the same «good» count for the same rating_name, then you will get more than two records. For example, if there are three ireland id_markets with a «good» count of 3, the highest, then how can you display the top two? You can’t. So the query will show all three.

Also, if there were one count of «3», the highest, and two counts of «2», you couldn’t show the top two, since you have a tie for second place, so the query shows all three.

The query will be simpler if you create a temporary table with the aggregate result set first, then work from that.

The following query:

What I’d like is only the top 5 results for each id:

Is there a way to do this using some kind of LIMIT like modifier that works within the GROUP BY?

14 Answers 14

You could use GROUP_CONCAT aggregated function to get all years into a single column, grouped by id and ordered by rate :

And then you could use FIND_IN_SET, that returns the position of the first argument inside the second one, eg.

Using a combination of GROUP_CONCAT and FIND_IN_SET , and filtering by the position returned by find_in_set, you could then use this query that returns only the first 5 years for every id:

Please see fiddle here.

Please note that if more than one row can have the same rate, you should consider using GROUP_CONCAT(DISTINCT rate ORDER BY rate) on the rate column instead of the year column.

The maximum length of the string returned by GROUP_CONCAT is limited, so this works well if you need to select a few records for every group.

Операторы GROUP BY и HAVING позволяют сгруппировать данные. Они употребляются в рамках команды SELECT:

GROUP BY

Оператор GROUP BY определяет, как строки будут группироваться.

Например, сгруппируем товары по производителю

Первый столбец в выражении SELECT — Manufacturer представляет название группы, а второй столбец — ModelsCount представляет результат функции Count, которая вычисляет количество строк в группе.

И если в выражении SELECT производится выборка по одному или нескольким столбцам и также используются агрегатные функции, то необходимо использовать выражение GROUP BY. Так, следующий пример работать не будет, так как он не содержит выражение группировки:

Оператор GROUP BY может выполнять группировку по множеству столбцов. Так, добавим группировку по количеству товаров:

Следует учитывать, что выражение GROUP BY должно идти после выражения WHERE , но до выражения ORDER BY :

Фильтрация групп. HAVING

Оператор HAVING позволяет выполнить фильтрацию групп, то есть определяет, какие группы будут включены в выходной результат.

Использование HAVING во многом аналогично применению WHERE. Только есть WHERE применяется для фильтрации строк, то HAVING — для фильтрации групп.

Например, найдем все группы товаров по производителям, для которых определено более 1 модели:

В одной команде также можно сочетать выражения WHERE и HAVING:

То есть в данном случае сначала фильтруются строки: выбираются те товары, общая стоимость которых больше 80000. Затем выбранные товары группируются по производителям. И далее фильтруются сами группы — выбираются те группы, которые содержат больше 1 модели.

Если при этом необходимо провести сортировку, то выражение ORDER BY идет после выражения HAVING:

Здесь группировка идет по производителям, и также выбирается количество моделей для каждого производителя (Models) и общее количество всех товаров по всем этим моделям (Units). В конце группы сортируются по количеству товаров по убыванию.

Использование LIMIT 1 в MySQL

спросил

Изменено 2 года, 7 месяцев назад

Просмотрено 85 тысяч раз

Когда целесообразно добавлять LIMIT 1 в конце запроса в MySQL. Обычно я добавляю его в DELETE, но я видел, как он используется с INSERT a и даже с UPDATE. Это излишество или хорошая практика?

 ВСТАВИТЬ В .. ЗНАЧЕНИЯ () ОГРАНИЧЕНИЕ 1
 

Не существует. Надеюсь, вы знаете, сколько VALUES() вы туда вставили!

 ВСТАВИТЬ В .. ВЫБРАТЬ ... ОГРАНИЧЕНИЕ 1
 

Существует и довольно полезен, и не по теме, так как LIMIT находится на SELECT.

 УДАЛИТЬ... ПРЕДЕЛ 1
 ОБНОВЛЕНИЕ... ОГРАНИЧЕНИЕ 1
 

Крайне редко полезно. Либо вы знаете свою базу данных достаточно, чтобы быть уверенным, что ваше WHERE соответствует UNIQUE условию, либо нет, и в этом случае вам следует потратить немного больше времени на изучение вашей базы данных и изучение SQL. 91

Может быть чрезвычайно полезным! Это создает почти незаблокированную очередь заданий, куда вы можете прийти и взять задание из очереди без какого-либо ожидания, блокировки или разрешения конфликтов. Вполне отлично.

 УДАЛИТЬ ИЗ КЭША ORDER BY last_update_time LIMIT N
 

Кэш занимает слишком много места? Очистить N самых старых строк. ..

0

Что ж, если вы воспользуетесь EXPLAIN, вы увидите, что это ускоряет процесс, так как, как только он находит один результат, он останавливается.

Это также отказоустойчиво — если вы знаете, что ваша вставка обновления должна затрагивать только одну строку, указав ее, вы гарантируете, что она никогда не пойдет не так и не испортит несколько строк.

2

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

1

Крайне редко полезно. Либо вы знаете свою базу данных достаточно, чтобы > быть уверенным, что WHERE соответствует условию UNIQUE, либо нет, и в этом случае вам > следует потратить немного больше времени на изучение вашей базы данных и изучение SQL

.

Есть случаи, когда предел 1 ДЕЙСТВИТЕЛЬНО полезен. Например, таблица без уникального ключа. Если у нас будет пять одинаковых, то сработает ограничение на один.

1

Предположим, вы пишете Забыли пароль код (в PHP):

 ОБНОВЛЕНИЕ
    `пользователи`
УСТАНОВЛЕН
    `pass` = ПАРОЛЬ('{$new_salted_pass}')
КУДА
    `account_id` = '{$account_id}'
ПРЕДЕЛ 1
 

Если ваше программное обеспечение представляет собой программное обеспечение как услугу (SaaS),

и несколько организаций используют ваше программное обеспечение,

и account_id организация_id поля вместе представляют собой уникальный идентификатор,

и Account_ID автоматически сгенерирована в коде, как SO:

Jones0001
Jones0002
Jones0003

и Инженер-программист забывает добавить и Organization_id = '{$ Orchany_id} 70707070707070707070709 и организация = к условию запроса

WHERE ,

и код проходит контроль качества при тестировании функции «Забыли пароль» в среде контроля качества,

и код затем передается в производство,

затем LIMIT 1 может ограничить ущерб, наносимый пользователями двух организаций с одним и тем же account_id.

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Выбирает ли MySQL «SELECT LIMIT 1» с несколькими записями первую запись сверху?

спросил

Изменено 2 года, 2 месяца назад

Просмотрено 102 тысячи раз

Я искал, искал и не могу найти ответ на этот вопрос, я, наверное, неправильно его задаю.

Я запрашиваю базу данных сотрудников.

Мне нужно получить подробную информацию на основе идентификатора должности, однако для этого идентификатора должности может быть несколько записей, поскольку в этой организации есть постоянные и временные сотрудники, занимающие одну и ту же должность.

Итак, чтобы получить ТЕКУЩУЮ занимающую позицию идентификатор, мне нужен мой запрос для ВЫБОРА ПЕРВОЙ записи, которая соответствует строке позиции, СВЕРХУ ВНИЗ.

выберет ли это первую совпавшую запись сверху?

 SELECT * WHERE `position_id`="00000000" LIMIT 1;
 

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

  • mysql
  • выбрать
  • лимит

1

Вам нужен Предложение ORDER BY для определения порядка между отдельными записями вашей таблицы. Если вы не используете ORDER BY , вы можете предположить отсутствие фиксированного порядка между записями, и вы можете получать новый порядок каждый раз, когда вы выполняете запрос.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *