Я создал таблицу 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, но я думаю, что это либо неправильный обработчик для этого случая, либо я использую его неправильно...
Вы хотите фильтровать. Один метод использует коррелированный подзапрос в предложении 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
);
Наименьший occ_id не всегда будет равен 1. Если событие происходит, например, в месяцах 4 и 5 и дважды в месяц, и я фильтрую по месяцу «5», то наименьший occ_id в этом случае, вероятно, будет 3.. .
ммм,
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
Работал как шарм! Думаю, теперь у меня тоже лучше получается подзапрос.