SQL: получить лимит записей для каждой сущности - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующие настройки (Java / Hibernate / PostgreSQL):

TeamName {
  id: Long;
  name: String;
  team: Team;
  ....
}

Series {
  id: Long;
  season: Season;
  dateScheduled: Date;
}

SeriesTeam {
  id: Long;
  series: Series;
  team: TeamName;
}

SeriesTeam {
  id: Long;
  team: TeamName;

}

Что я хочу сделать, это сделать выбор из предыдущих n серий (скажем, 10) или следующей серии из текущейДата.Вот что у меня есть на данный момент:

select s.* from series s
inner join series_teams st on st.series_id = s.id
inner join team_names tn on tn.id = st.team_name_id
where tn.id in (:teamIds) and s.date_scheduled < CURRENT_DATE
order by s.date_scheduled desc

Но это принесет мне всю предыдущую серию для всех команд, и мне придется использовать Java, чтобы выбрать то, что я хочу.Я хочу?Спасибо!

РЕДАКТИРОВАТЬ: Например, скажем, я хотел ограничить 10 для каждой команды, и есть 24 команды, я хотел бы вернуть максимум 240 записей.(при условии, что 10 существует до текущей даты)

EDIT2: Вот код, который я хочу для отдельной команды:

select s. from series s
inner join series_teams st on st.series_id = s.id
where st.team_name_id=85 and s.date_scheduled < CURRENT_DATE
order by s.date_scheduled desc
limit 10

Мне просто нужно иметь возможность применить это для всех команд.... Я не хочу делать х SQL-вызовов для каждой команды.

1 Ответ

0 голосов
/ 08 октября 2018

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

По сути, я объединил все необходимые таблицы вместе, затем создал новый столбец, который будет сообщать мне, является ли эта строка той, которую мы должны вернуть, и добавил эту проверку в предложении where..

https://www.w3schools.com/sql/trysql.asp?filename=trysql_op_in

SELECT e.employeeid, lastname,orderdate, orderdate in (select orderdate from 
orders ord where e.employeeid=ord.employeeid order by orderdate limit 2) as 
good FROM Employees as e join orders as o on e.employeeid=o.employeeid where 
good=1 order by e.employeeid, o.orderdate;

для вашего случая:

select s.id, s.season_id, s.date_scheduled, st.team_name_id, 
s.date_scheduled in (
    select s2.date_scheduled from series s2
    inner join series_teams st2 on st2.series_id = s2.id
    inner join team_names tn2 on tn2.id = st2.team_name_id
    where tn.id =tn2.id and s2.date_scheduled < CURRENT_DATE
    order by s.date_scheduled desc limit 5
) as foo
from series s
inner join series_teams st on st.series_id = s.id
inner join team_names tn on tn.id = st.team_name_id
where tn.id in (:teamIds) and foo = true
order by st.team_name_id, s.date_scheduled desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...