Выборка случайных записей RAND(), но с определенным распределением

Всем привет!

А вот такую штуку ни не делал?

Допустим, есть 100 записей в базе, с полем дата, от 2010 до 2019 года.

Мне нужно вывести 10 случайных из них, но так, чтобы у свежих записей был приоритет, их должно быть больше, особенно в начале этой выборки.
К примеру я должен получить записи за 2018, 2019, 2016, 2012, 2019, 2017, 2014, 2015, 2016, 2010 года.

С одной стороны хочу показать случайные записи, а с другой, не хочу показывать старые, особенно в первой половине выборки.

В голову приходит только сделать штуки 3 случайные выборки за 2019-2017, 2016-2014, 2014-2010 года и объединить их.
Наумов Алексей
13 сентября 2019, 09:15
modx.pro
993
0

Комментарии: 5

ElenaLelo
13 сентября 2019, 10:37
+1
А нельзя написать небольшой сниппет, который выводит рандомные числа из количества дочерних ресурсов, его результат работы поместить куда нибудь в element/parent? А сортировку уже написать не rand(), а {«publishedon»:«ASC»} какую надо?
    Наумов Алексей
    13 сентября 2019, 10:47
    0
    Да вот и не знаю, какую сортировку писать…
    Даже сформулировать тяжело. Вероятнее всего да, нужно самому сформировать список id Объектов, а потом уже их сами и выбирать через pdoResources или что удобнее.
      ElenaLelo
      13 сентября 2019, 11:16
      +1
      Вот что похожее надо, мне кажется
      [[!pdoResources? 
      	&parents=`0` 
      	&resources=`[[!pdoResources? &sortby=`RAND()` limit=`10`&returnIds=`1`]]`
      	&limit=`10` 
      	&sortby=`{«publishedon»:«ASC»}` 
      ]]
        Наумов Алексей
        13 сентября 2019, 14:03
        0
        Да… примерно…
        Спасибо. Хотя здесь может быть ситуация, когда свежий записей в выборке не будет…
          ElenaLelo
          13 сентября 2019, 14:52
          +1
          Свежей записи это какую то надо закрепить?
          Можно вот так закрепить вот так
          &resources=`11, 12, 13, [[!pdoResources? &sortby=`RAND()` limit=`10`&returnIds=`1`]]`
          Или сделать еще один запрос сюда, но, дописать sortby по дате публикации, напр. и выводить 2 самые свежие, или отобрать через where рандомные, но опубликованные в этом году
          &resources=`[[!pdoResources? &sortby=`{"publishedon":"ASC"}` limit=`2`&returnIds=`1`]],[[!pdoResources? &sortby=`RAND()` limit=`10`&returnIds=`1`]]`
          Конечно, лучше все это дело вынести в свой сниппет и сделать всю эту выборку одним getCollection, я думаю. Но выводить нужно набор id и их уже сортировать, иначе вряд ли получится
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    5