Вам нужно будет сделать это, используя UNION
из 3 запросов, чтобы найти случайных «золотых», «серебряных» и «бронзовых» медалистов, а затем упорядочить эти результаты, используя FIELD
:
SELECT color, id
FROM (
(
SELECT color, id
FROM cards
WHERE color = 'gold'
ORDER BY RAND()
LIMIT 2
)
UNION ALL
(
SELECT color, id
FROM cards
WHERE color = 'bronze'
ORDER BY RAND()
LIMIT 1
)
UNION ALL
(
SELECT color, id
FROM cards
WHERE color = 'silver'
ORDER BY RAND()
LIMIT 2
)
) m
ORDER BY FIELD(color, 'gold', 'bronze', 'silver')
Демонстрация по SQLFiddle
Вот способ, которым вы можете реализовать это как комбинацию PHP / MySQL:
$pack_sql_comma_separated = 'gold,silver,gold,gold,silver,gold';
$colors = explode(',', $pack_sql_comma_separated);
$counts = array_count_values($colors);
$sql = "SELECT color, id FROM (";
$subqueries = [];
foreach ($counts as $color => $count) {
$subqueries[] = "(
SELECT color, id
FROM cards
WHERE color = '$color'
ORDER BY RAND()
LIMIT $count
)";
}
$sql .= implode(' UNION ALL ', $subqueries) . ') m';
// run SQL query
// ...
// assume all query results read into $rows according to medal colour, something like this
$rows = array('gold' => array(array('id' => 20),
array('id' => 5),
array('id' => 4),
array('id' => 27)
),
'silver' => array(array('id' => 19),
array('id' => 11)
)
);
//display in required order
foreach ($colors as $color) {
$card = array_shift($rows[$color]);
echo "$color {$card['id']}\n";
}
Демонстрация на 3v4l.org