Выберите строки с наименьшим значением в определенном столбце из тех, которые соответствуют другим критериям

Я создал таблицу SQL для сохранения в ней данных о событиях.

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

Мне нужно получить из совпадающих строк — только одну строку из каждого event_id, и она должна быть с наименьшим значением occ_id.

то есть

gen_id  | event_id | occ_id | month
------------------------------------
1       | 190      | 1      | 4    
2       | 190      | 2      | 4    
3       | 190      | 3      | 4    
4       | 192      | 1      | 4    
5       | 192      | 2      | 4    
6       | 192      | 3      | 4    
7       | 193      | 1      | 5    
8       | 193      | 2      | 5

Если я ищу события из месяца = 4, мне нужно получить события (gen_id): 1,4

и если я ищу месяц = ​​5, мне нужно получить только событие (gen_id): 7

Мой SQL-запрос прямо сейчас получает соответствующие события, но без фильтрации occ_id:

(сейчас это выглядит примерно так)

SELECT
    event_id,
    event_title,
    occ_id
    FROM
    table_name
    WHERE month = 4
    GROUP BY event_id
    ORDER BY
    event_id
    DESC

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы хотите фильтровать. Один метод использует коррелированный подзапрос в предложении WHERE:

select t.*
from table_name t
where t.occ_id = (select min(t2.occ_id)
                  from table_name t2
                  where t2.event_id = t.event_id
                 );

Однако наименьшее значение всегда кажется равным «1», так что это тоже может работать:

select t.*
from table_name t
where t.month = 4 and
      t.occ_id = 1;

Чтобы добавить month, вы можете добавить его во внешний запрос:

select t.*
from table_name t
where t.month = 4 and
      t.occ_id = (select min(t2.occ_id)
                  from table_name t2
                  where t2.event_id = t.event_id and
                        t2.month = t.month
                 );

Работал как шарм! Думаю, теперь у меня тоже лучше получается подзапрос.

glng 10.04.2019 13:39

Наименьший occ_id не всегда будет равен 1. Если событие происходит, например, в месяцах 4 и 5 и дважды в месяц, и я фильтрую по месяцу «5», то наименьший occ_id в этом случае, вероятно, будет 3.. .

glng 10.04.2019 13:47

ммм,

select t.event_id, t.occ_id, t.month, min(t.gen_id) from (
    select event_id,month,min(occ_id) as min_occ_id from t where month=5 group by event_id, month
) t1 join t on t1.min_occ_id = t.occ_id and t1.event_id = t.event_id and t1.month = t.month
group by t.event_id, t.occ_id, t.month;

если столбцы event_id,occ_id,month составляют УНИКАЛЬНЫЙ КЛЮЧ, SQL можно упростить.

select t.event_id, t.occ_id, t.month, t.gen_id from (
    select event_id,month,min(occ_id) as min_occ_id from t where month=5 group by event_id, month
) t1 join t on t1.min_occ_id = t.occ_id and t1.event_id = t.event_id and t1.month = t.month

Другие вопросы по теме