SQL-запрос, получить только две строки на пользователя - PullRequest
2 голосов
/ 09 марта 2012

У меня есть эта таблица, которая содержит идентификатор объявления и идентификатор пользователя.Любой пользователь может иметь несколько объявлений.Я хочу показывать только две рекламы на пользователя (или одну, если у него есть только одна).Выходные данные должны быть случайными.

CREATE TABLE IF NOT EXISTS `ads` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_user` int(12) NOT NULL,
  `title` varchar(255) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

Таблица содержит это:

1, 1, 'erfw', 'google.pt'
2, 2, 'yhtg', 'google.pt'
3, 2, 'gfddfg', 'google.pt'
4, 3, 'ehgfd', 'google.pt'
5, 2, '435yet', 'google.pt'
6, 1, 'ikkt', 'google.pt'
7, 1, 'wyrths', 'google.pt'

Выходные данные должны быть:

1, 1, 'erfw', 'google.pt'
2, 2, 'yhtg', 'google.pt'
3, 2, 'gfddfg', 'google.pt'
4, 3, 'ehgfd', 'google.pt'
6, 1, 'ikkt', 'google.pt'

Выходные данные должны отличаться от времени квремя, чтобы получить все объявления в случайном порядке.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2012

В MySQL при выполнении любой Greatest-n-per-group будут использоваться переменные MySQL. Сохраните последнюю «вещь», а другую - для вашего «нумерационного» назначения (которое в данном случае должно быть случайным)

select
      PreQuery.*,
   from
      ( select @lastUser := 0,
               @lastAdSeq := 0 ) sqlvars,
      ( select
              ads.id_user,
              ads.id,
              ads.title,
              ads.url,
              @lastAdSeq := if( @lastUser = ads.id, @lastAdSeq +1, 1 ) as Seq,
              @lastUser := ads.id_user as carryover
           from
              ads
           order by
              ads.id_user,
              rand() 
           having Seq <= 2 ) PreQuery

Условие "HAVING" важно понимать в том смысле, что поясняет, что предложение "HAVING" применяется ПОСЛЕ любого "GROUP BY" или "ORDER BY" и применяется к ПОСЛЕ записи в наборе результатов (и не оптимизирован ни одним предложением WHERE).

Тем не менее, мы запрашиваем объявления, упорядоченные по идентификатору пользователя, но случайные секунды. Это заставляет все "объявления" человека как рандомизированные. После этого применяются переменные @ и строится счетчик последовательности на пользователя. Затем применяется условие hasing, и как только оно достигает 3 или более, результаты выбрасываются за пределы окончательного набора результатов. И вы остаетесь с НАИБОЛЕЕ 2 объявления на пользователя.

сначала нужно выполнить, чтобы запросить упорядоченные данные

0 голосов
/ 09 марта 2012

Это похоже на очень похожую проблему на этот вопрос:

Как сделать эквивалент "предельного значения"?

Использование двух вложенных SELECT запросов с LIMIT и DISTINCT должно помочь вам.

...