Mysql - выбрать случайные 4 данных из столбца, отличного от 2 различных столбцов

0

Я пытаюсь выбрать 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
Теги:
mysqli
random

1 ответ

0

Как насчет сортировки случайных данных, тогда используйте mysql ONLY_FULL_GROUP_BY поведение по умолчанию (отключено):

Это заставляет MySQL принимать предыдущий запрос. В этом случае сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными, что, вероятно, не является тем, что вы хотите. Более того, выбор значений из каждой группы не может зависеть от добавления предложения ORDER BY.

SQL Fiddle

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 |
  • 0
    Хорошо, этот подход тоже хорош, спасибо, но я хочу, чтобы 2 данных от Y и 2 от C, в этом случае иногда он может объединять 3Y и 1C @danihp
  • 0
    О, чувак, я не читал все правила. Виноват.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню