Это короткий фрагмент очень длинного запроса с примерно 6 союзами, но все они примерно одинаковы. c:
(SELECT cr.id, cr.price, cd.times, cd.name, cr.set_rarity, cd.type, cd.currentPrice_tcg
FROM card_sets_rarity cr
JOIN card_database cd
ON cr.id = cd.id
WHERE cr.set_rarity = 'Common'
AND cr.set_name = 'Dark Beginning 1'
AND cd.type = 'Spell Card'
GROUP BY cd.id ORDER BY RAND() LIMIT 2)
UNION
(SELECT cr.id, cr.price, cd.times, cd.name, cr.set_rarity, cd.type, cd.currentPrice_tcg
FROM card_sets_rarity cr
JOIN card_database cd
ON cr.id = cd.id
WHERE cr.set_rarity = ?
AND cr.set_name = 'Dark Beginning 1'
AND cd.type = 'Spell Card'
GROUP BY cd.id ORDER BY RAND() LIMIT 1)
Во втором запросе редкость устанавливается в зависимости от случайности Вычислено в PHP. Итак, я получаю случайное число, и если оно меньше 5, редкость - «Rare
», но если оно больше 5, редкость «Common
».
Теперь проблема возникает, когда оно получает «Common
. ", иногда запрос выбирает общий, который уже был выбран в первом запросе ( Мне не нужны дубликаты ). Можно ли это обойти? Как я могу сделать так, чтобы он избегал выбора дубликата, который будет удален UNION
?
MySQL Версия 5.7.30
Пример скрипта DB: https://www.db-fiddle.com/f/7wFDnYuVPt15qPorQvemrw/4
Дальнейшее объяснение :
Что мне нужно: всегда возвращать 3 уникальные строки, используя это UNION
.
Проблема: иногда возвращает 2 строки, поскольку второй запрос может закончиться выбором строки, которая уже была выбрана в первом запросе.
UNION ALL
не будет работать, поскольку он вернет дубликаты.