首页 > 解决方案 > MySQL 联合和重复

问题描述

这是一个很长的查询的一小段,大约有 6 个联合,但它们的逻辑大致相同:

(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

进一步解释

我需要什么:始终使用 this 返回 3 个唯一行UNION

问题:它有时会返回 2 行,因为第二个查询最终会选择在第一个查询中已经选择的行。

UNION ALL将不起作用,因为它将返回重复项。

标签: mysql

解决方案


我会更改查询的可变部分。现在你的参数是set_raritycr.set_rarity = ?)。我会让它固定为“稀有”,但使 LIMITs 变量。

假设您的 PHP 代码中有这样的内容:

if ($randomNumber > 5) {
    $rarityParam = 'Common';
} else {
    $rarityParam = 'Rare';
}

我会将其更改为:

$commonLimitParam = 2;
$rareLimitParam = 0;

if ($randomNumber > 5) {
    $commonLimitParam += 1;
} else {
    $rareLimitParam   += 1;
}

并将上述参数绑定到以下查询中:

(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 ?)

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 = 'Rare'
AND cr.set_name = 'Dark Beginning 1'
AND cd.type = 'Spell Card'
GROUP BY cd.id ORDER BY RAND() LIMIT ?) 

推荐阅读