MySQL: ограничение количества результатов для каждой группы в запросе на основе результатов другого запроса. - PullRequest
0 голосов
/ 07 февраля 2012

Я хотел бы заранее поблагодарить всех за любую помощь, которую вы бы поделились в этом следующем вопросе.

В mysql у меня есть следующие таблицы:

выберите id, product_id из MembersProducts;

Member Products

id | product_id
1  | 2
1  | 3
1  | 4
1  | 5
1  | 6
2  | 5
2  | 6

выберите идентификатор, (TimesPerDay * TimesPerWeek) из расписания;

Schedule
id | (TimesPerDay * TimesPerWeek)
1  | 2
2  | 1

Я хотел бы создать запрос, который создает следующую таблицу:

Member Products

id | product_id
1  | 2
1  | 3
2  | 5

Моя цель - ограничить число product_id столбцом (TimesPerDay * TimesPerWeek) для каждого идентификатора.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012
SELECT mp.*
FROM MembersProducts mp
LEFT JOIN Schedule s ON mp.id=s.id
WHERE (SELECT COUNT(*)
       FROM MembersProducts mp2
       WHERE mp2.id=mp.id
       AND mp2.product_id<mp.product_id
) < s.TimesPerDay*s.TimesPerWeek

То, что это делает, - это, по сути, выбор "наибольший n на группу", где n также варьируется для каждой группы.

WHERE подсчитывает, сколько других продуктов уже быловыбрано и выбирает их только в том случае, если оно недостаточно выбрано (достаточно TimesPerDay * TimesPerWeek).

0 голосов
/ 07 февраля 2012
select e.id, e.product_id 
from (select @rank:=CASE WHEN @ranked <> id THEN 1 ELSE @rank+1 END as rank,
          id,
          product_id, 
          @ranked:=id 
      from 
          (select @rank := -1) a, 
          (select @ranked :=- 1) b, 
          (select * from member_products order by id) c
      ) e 
inner join (select id, (TimesPerDay * TimesPerWeek) as times from schedule) sch 
    on sch.id = e.id and e.rank <= sch.times;

Гадкий вид, но это будет именно то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...