MySQL: Выбрать n-е строки, где есть хотя бы m атрибут? - PullRequest
0 голосов
/ 13 июля 2020

поэтому у меня есть такая база данных:

id            role              name
1             admin              A     
2             admin              B
3             admin              C
4             admin              D
5             user               E
6             user               F
7             user               G

Прямо сейчас, например, я хочу запросить случайные 4 строки, которые имеют как минимум 2 роли администратора и как минимум 1 роль пользователя. Примерно так:

SELECT * FROM table WHERE role = "admin" МИНИМУМ 2 и role = "user" не менее 1

Итак, я хочу, как A, C, D, E или A, B, E, F, но не A, B, C, D или A, E, F, G.

Есть ли способ сделать такой запрос который ? Спасибо.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете упорядочить строки, поместив две строки для администратора и одну для пользователя вверху:

select t.*
from (select t.*,
             row_number() over (partition by role order by rand()) as seqnum
      from t
     ) t
order by ((case when role = 'admin' then seqnum else 999 end) <= 2) desc,
         ((case when role = 'user' then seqnum else 999 end) <= 2) desc,
         rand()
limit 4

Это присвоит порядковый номер каждой role. Затем он использует несколько ключей в order by для получения нужных вам чисел.

Здесь - скрипка db <>.

0 голосов
/ 13 июля 2020

Вы можете использовать UNION ALL

вот так

(SELECT * FROM mytable WHERE role = 'admin' LIMIT 2) UNION ALL (SELECT * FROM mytable WHERE role = 'user' LIMIT 2)

...