Я пытаюсь выбрать 4 разных случайных данных из таблицы на Mysql, но я хочу, чтобы некоторые поля были уникальными, например;
У меня есть таблица
Название таблицы "видео" и данные;
id f2 f3 f4
-- -- -- --
1 a q C
2 a w Y
3 b e C
4 b r Y
5 c t C
6 c y Y
7 d u C
8 d o Y
Я хочу случайно выбрать 4 данных из f3, но f2 должен быть уникальным. И f4 должен быть уникальным для каждого f2, я имею в виду, что я должен случайно получить "u" или "o" не оба. Поэтому в конце концов я хочу получить столбец данных 2xC от уникальных f2 и данных 2xY от уникального f2. Результат, который я хочу получить, похож;
f3 f3 f3
-- -- --
q or| q or| w
r or| e or| r
t or| y or| t
o or| o or| u
Здесь образец, который я создал в MsSql, но не могу преобразовать его в Mysql;
select e.* from (
select top 4 f2,
ROW_NUMBER() OVER (ORDER BY newId()) AS RowNumber
from (
select distinct(f2) from videos
) x
) a inner join (
select top 4 ones.n,
ROW_NUMBER() OVER (ORDER BY newId()) AS RowNumber
FROM (VALUES('C'),('Y'),('C'),('Y')) ones(n)
) b on a.RowNumber = b.RowNumber
inner join videos e on a.f2 = e.f2 and b.n =e.f4
Как насчет сортировки случайных данных, тогда используйте mysql ONLY_FULL_GROUP_BY
поведение по умолчанию (отключено):
Это заставляет MySQL принимать предыдущий запрос. В этом случае сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными, что, вероятно, не является тем, что вы хотите. Более того, выбор значений из каждой группы не может зависеть от добавления предложения ORDER BY.
MySQL 5.6 Настройка схемы:
create table t ( id int, f2 char, f3 char, f4 char );
insert into t values
(1 ,'a' ,'q' ,'C'),
(2 ,'a' ,'w' ,'Y'),
(3 ,'b' ,'e' ,'C'),
(4 ,'b' ,'r' ,'Y'),
(5 ,'c' ,'t' ,'C'),
(6 ,'c' ,'y' ,'Y'),
(7 ,'d' ,'u' ,'C'),
(8 ,'d' ,'o' ,'Y');
Запрос 1:
select f2, f3, f4
from (
select f2, f3, f4
from (
select f2, f4, f3 from
( select f2, f4, f3
from t
order by rand()
) t0
group by f2
) t1
order by RAND()
) t2
group by f2, f4
| f2 | f3 | f4 |
|----|----|----|
| a | w | Y |
| b | r | Y |
| c | t | C |
| d | o | Y |