MySQL выберите случайную строку с каждым другим значением - ввод через запятую - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть строка, разделенная запятыми:

input_str: 'золото, серебро, золото, броуз, серебро'

У меня есть одна карточная таблица, которая имеет цвет столбца. Таблица карт содержит сотни строк для каждого из цветов.

Теперь с помощью запроса mysql я хочу выбрать 1 случайную строку из карт с этими цветами

Итак, результат будет

id      color 
6251    gold
7251    silver
827127  gold
234     bronze
27816   silver

Я пробовал по крайней мере 10 различных запросов, но ни один из них не работает правильно.

Подход, который я использовал, заключается в преобразовании строки, разделенной запятыми, во временную таблицу и затем присоединении к этой временной таблице к таблице цветов и используйте подзапрос для ORDER BY RAND (), но ни один из запросов не сработал для меня.

Может ли кто-нибудь любезно помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Требуется случайная запись для каждого цвета, указанного в списке, разделенном запятыми.

Если вы используете MySQL 8.0, вы можете сначала отфильтровать с помощью find_in_set() и назначить случайный ранг каждой записи в группы, имеющие один и тот же цвет, а затем отфильтруйте во внешнем запросе:

select id, color
from (
    select 
        t.*,
        row_number(partition by t.color order by rand()) rn
    from mytable t
    where find_in_set(t.color, ?)
) t
where rn = 1

Знак вопроса обозначает параметр, содержащий список с разделителями.

0 голосов
/ 16 февраля 2020

На основе

create table cards
(
    id    int         null,
    color varchar(50) null
);

create index table_name_color_index
    on cards (color);

INSERT INTO cards (id, color) VALUES (1, 'gold');
INSERT INTO cards (id, color) VALUES (2, 'silver');
INSERT INTO cards (id, color) VALUES (3, 'gold');
INSERT INTO cards (id, color) VALUES (4, 'red');
INSERT INTO cards (id, color) VALUES (5, 'blue');

, если вы можете отформатировать входную строку

select * from cards where color IN ('gold','silver','bronze');

, если нет

select * from cards where FIND_IN_SET(color,'gold,silver,gold,broze,silver');

и для 1 случайного результата получается:

select * from cards where color IN ('gold','silver','bronze') order by RAND() limit 1;
...