2012-02-07 4 views
0

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

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

выберите идентификатор, product_id из MembersProducts;

 
Member Products 

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

select id, (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) для каждого идентификатора.

ответ

0
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; 

Уродливый вид, но это сделает именно то, что вам нужно.

+0

Привет, Франциско, большое спасибо за ваш ответ! Извините за задержку в ответе, просто зашел с работы. После того, как я попробую формулу, я думаю, что внутреннее соединение работает, потому что число результатов на один идентификатор работает правильно. product_id не является к сожалению. Он будет показывать тот же product_id 18 раз, затем перейти к следующему. Он всегда начинается с 1. Мне нужно было обновить код, чтобы он соответствовал моей конкретной потребности. Вот обновление: http: //mikesturgill.com/uncategorized/code/ (извините, код не вписывался в поле комментариев, и я не мог добавить второй комментарий с кодом в нем) – StaticMike

+0

Ну, до тех пор, пока вы заставили его работать и чему-то научились! –

1
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 изменяется в зависимости от группы тоже.

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

+0

Спасибо кофе! Я проверил код и не смог заставить его работать. Я получаю только первые 2 идентификатора и только 1 product_id за строку (2 результата). Я обновил код ... вот мое обновление: [code] (http://mikesturgill.com/uncategorized/code2/) – StaticMike

+0

Возможно, это потому, что у вас недостаточно записей в MemberProducts для выбора или из-за вашего Значения расписания? [Здесь] (http://sqlfiddle.com/#!2/8ed0b/1) представляет собой sqlfiddle, показывающий запрос, обрабатывающий данные в вашем вопросе. –

Смежные вопросы