Лимит и порядок по ранду - в группах - PullRequest
1 голос
/ 03 ноября 2019

Может быть, я запутался, но мне кажется, что я сейчас нахожусь не на том пути, чтобы найти решение.

Я хотел бы выбрать случайные данные из таблицы, но с некоторыми ограничениями Допустим, таблица имеетИМЯ и ВОЗРАСТ ... 10.000 строк

Я хотел бы выбрать (в таком порядке)

  • 2 случайных людей старше 60 лет
  • 2случайные люди старше 40 лет (включая более 60)
  • 2 случайные люди в любом возрасте.

И, конечно, все разные.

Результат

Andy 77
Maria 64
Harry 54
Fritz 62
Anna 24
Moses 43

Какое ваше лучшее решение?

Я думал, что UNION и LIMIT будут работать с ORDER BY RAND () ... но нет ... не разрешено Order by с ограничениями?

Хорошо, в идеальном мире это будет работать

select name, age from persons where age >60 order by rand() limit 2 
UNION 
select name, age from persons where age >40 order by rand() limit 2 
UNION 
select name, age from persons where 1 order by rand() limit 2

(это, конечно, не так), и в него входит ошибка, что выбор может включать в себя 2 раза одного и того же человека ...

Так, как я могу решить это?

выберите имя, возраст из людей, упорядочите случай, когда возраст> 60 тогда 'a' предел 2, когда age> 40, затем «b» предел 2, иначе 1 предел «c» asc

, что, конечно, тоже не работает ..

1 Ответ

0 голосов
/ 08 ноября 2019

Может быть, слишком поздно, но я думаю, что это работает:

select t.name, t.age
from (
  select * from (
    select t.name, t.age, min(t.ingroup) ingroup
    from (
      select * from (
        select name, age, 1 ingroup from tablename
        where age > 60
        order by rand() limit 2
      ) t1
      union all
      select * from (
        select name, age, 2 ingroup from tablename
        where age > 40
       order by rand() limit 4
      ) t2
    ) t  
    group by t.name, t.age
    order by ingroup limit 4
  ) g12
  union all
  select * from (
    select name, age, 3 ingroup from tablename
    order by rand() limit 8
  ) g3
) t
group by t.name, t.age
order by min(t.ingroup) limit 6

См. Демоверсию (я добавил больше строк к вашим образцам данных).

...