mysql - 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
将不起作用,因为它将返回重复项。
解决方案
我会更改查询的可变部分。现在你的参数是set_rarity
(cr.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 ?)
推荐阅读
- unity3d - Unity - 当角色控制通过时,不会调用 OnTriggerExit
- javascript - 使用 Ramda.js 基于数组过滤对象
- javascript - jhipster客户端无法运行,服务器端成功
- r - 在 R 中找到 n 个泊松值的期望
- mpdf - mpdf临时文件目录在服务器上传时不可写
- sqlite - 将小时数添加到 Sqlite 中的时间戳列会导致 NULL,为什么?
- openstreetmap - GeoServer / GWC / WMTS Return (400) Bad Request for part of map
- python - 如何实现在超类中打印对象的方法?
- javascript - 从远程服务器刷新语义 UI 下拉列表的内容
- c# - Google 报告未显示在 Mvc c# 的 pdf 报告中