Перейти к содержимому



Сгруппировать записи по полю вернуть по одной случайной записи

#1 fedornabilkin
fedornabilkin
  • Модератор
  • 1 183 сообщений
  • Репутация: 204
0

Отправлено 29 Октябрь 2013 - 14:39

Надо сгруппировать записи по полю position и вернуть по одной случайной записи из каждой группы.
Если, например, есть
две записи position = 'header'
три записи position = 'block'
две записи position = 'chat'

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

 

 

  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#2 fedornabilkin
fedornabilkin
    Topic Starter
  • Модератор
  • 1 183 сообщений
  • Репутация: 204

Отправлено 30 Октябрь 2013 - 09:48

Вчера пол дня пытался разобраться с запросом, но никак не получилось.
Поэтому опишу ситуацию подробнее.
Хочу сделать функционал для рекламодателей на сайте.
Пользователь создает рекламную кампанию и указывает место расположения баннера, грузит сам баннер и указывает урл.
Доступно три позиции: в шапке, в сайдбаре и в окне чата. Так как рекламных кампаний будет несколько на каждую позицию, то каждый раз необходимо выбирать случайную кампанию (строку записи в БД) на каждую позицию. Т.е. из всех строк надо выбрать случайную запись для отображения в шапке, в сайдбаре и в чате.
Если в запросе использовать группировку по полю position, то БД возвращает по одной первой записи всегда, а надо всегда разные, случайные.

Есть мысль выбрать все записи, перемешать и обработать форичем, но это на мой взгляд не эффективно. Тем более, если будет большое количество рекламных кампаний. Хотелось бы полностью переложить задачу на БД.
  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#3 1putnik
1putnik
  • Неактивные
  • 96 сообщений
  • Репутация: 8

Отправлено 02 Ноябрь 2013 - 17:19

По-моему лучше сделать 3 таблицы - 'header', 'block' и 'chat' и тогда будет легче сделать случайный выбор.
  • 0

#4 fedornabilkin
fedornabilkin
    Topic Starter
  • Модератор
  • 1 183 сообщений
  • Репутация: 204

Отправлено 05 Ноябрь 2013 - 14:06

По-моему лучше сделать 3 таблицы

Нет, это увеличивает количество запросов и нарушает принцип БД.
В итоге сделал так: получаю все записи в случайном порядке, прогоняю форичем и формирую массив, в которые попадают последние строки.
Если будет много записей, надо будет придумывать что-то другое.
  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#5 1putnik
1putnik
  • Неактивные
  • 96 сообщений
  • Репутация: 8

Отправлено 06 Ноябрь 2013 - 21:50

Нет, это увеличивает количество запросов и нарушает принцип БД.

3 таблицы по одному запросу.
Первый запрос из шапки сайта, второй из блока, третий из чата.
Выбирается одна случайная запись по id номеру из каждой таблицы.
А в вашем варианте будет меньше запросов?
  • 0

#6 fedornabilkin
fedornabilkin
    Topic Starter
  • Модератор
  • 1 183 сообщений
  • Репутация: 204

Отправлено 18 Ноябрь 2013 - 11:12

А в вашем варианте будет меньше запросов?

Согласись, один запрос экономнее, чем три и одна таблица компактнее, чем три.
  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.




Пользователь месяца
Totti Totti 1-й за Январь
Очков активности: 3 937 6 тем, 87 сообщений, 25 баллов репутации
ТОП самых активных за этот месяц
  • Фотография Megoydagi
    #1

    Megoydagi (24ho.ru)
    Очков активности: 612 5 тем, 53 сообщения, 6 баллов репутации

  • Фотография NataliaAntalia
    #2

    NataliaAntalia (zdorovemedicina.ru)
    Очков активности: 139.5 Вне конкурса за определение пользователя месяца

  • Фотография BLIK
    #3

    BLIK
    Очков активности: 76.5 Вне конкурса за определение пользователя месяца

  • Фотография magnet
    #4

    magnet (rbfxdirect.com)
    Очков активности: 55.5 2 темы, 31 сообщение, 1 балл репутации

  • Фотография Totti
    #5

    Totti
    Очков активности: 42 Вне конкурса за определение пользователя месяца

  • Фотография albedo
    #6

    albedo (online24news.ru)
    Очков активности: 34.5 1 тема, 20 сообщений, 1 балл репутации

  • Фотография TindrumGM
    #7

    TindrumGM (novosti-land.ru)
    Очков активности: 28.5 5 тем, 4 сообщения, 1 балл репутации

  • Фотография MattCutts
    #8

    MattCutts (dmitrylee.ru)
    Очков активности: 22.5 Вне конкурса за определение пользователя месяца

  • Фотография kolver
    #9

    kolver
    Очков активности: 21 2 темы, 8 сообщений, 1 балл репутации

  • Фотография Владислава Рыкова
    #10

    Владислава Рыкова
    Очков активности: 21 0 тем, 7 сообщений, 2 балла репутации

  • Показать весь ТОП 10
Поддержите форум! =)
Апдейты
  • Яндекс ИКС: 30.01.2020
  • Яндекс выдача: 23.02.2020
Топ 5 участников по репутации

Оформление форума – IPBSkins.ru