我编写了一个代码来告诉我一个rpg游戏中有多少玩家在使用一个特定的类(所以我也检查了一手剑、剑和二手剑,它应该告诉我任何手握剑的100级以上玩家的姓名和级别,这是代码:
declare @level varchar(100)
set @level=80
select level,name from characters c
inner join items i on i.characterId=c.characterId
where
( level>@level AND equipSlot=5 and (
itemId=2002 OR --short sword
itemId=2005 OR --steel rapier
itemId=2010 OR --volt sword
itemid=2012 OR --goblin knife
itemId=2017 OR --crimson sword
itemId=2026 OR --tree splitter sword
itemId=2031 OR --sea king sword
itemId=2034 OR --acrodont blade
itemid=2054 OR --halloween sword
itemId=2059 --stinger
))
and
(level>@level and equipSlot=6 and (
itemId=2002 OR --short sword
itemId=2005 OR --steel rapier
itemId=2010 OR --volt sword
itemid=2012 OR --goblin knife
itemId=2017 OR --crimson sword
itemId=2026 OR --tree splitter sword
itemId=2031 OR --sea king sword
itemId=2034 OR --acrodont blade
itemid=2054 OR --halloween sword
itemId=2059 --stinger
))
ORDER by level desc因此,我检查第一手(equipslot=6),检查一个可用的剑是否装备,那么如果二手(equipslot=5)也有剑,这意味着这家伙正在使用2剑类。
但是,当我在两个括号之间放一个and时,它什么也做不了。它显示了当我使用or时,所有的人都直接使用剑,所以不使用2把剑的人也出现了。
我不知道如何选择球员的名字和等级一次(因为当他们使用两把剑,他们的名字出现两次而不是一次),所以检查他们的手,如果他们手里有剑,显示他们的名字和级别。
发布于 2020-10-17 20:40:04
您需要检查属于给定字符的items组是否满足以下条件,这意味着聚合:
select c.name
from characters c
inner join items i on i.characterId=c.characterId
where
i.level > @level
and i.equipslot in (5, 6)
and i.itemid in (2002, 2005, 2010, 2012, 2017, 2026, 2031, 2034, 2054, 2059)
group by c.name
having count(distinct equipslot) = 2如果要显示每只手的级别,可以:
select c.name,
max(case when i.equipslot = 5 then level end) level_hand_5,
max(case when i.equipslot = 6 then level end) level_hand_6
from characters c
inner join items i on i.characterId=c.characterId
where
i.level > @level
and i.equipslot in (5, 6)
and i.itemid in (2002, 2005, 2010, 2012, 2017, 2026, 2031, 2034, 2054, 2059)
group by c.name
having count(distinct equipslot) = 2备注:
。
in可以方便地缩短多个or条件https://stackoverflow.com/questions/64407077
复制相似问题