首页 > 解决方案 > 如何使用条件检查两件事,当两件事为真时,它会提供信息

问题描述

我做了一个代码来告诉我一个 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但是当我在 2 括号之间加上一个时,它什么也没做。当我使用时,它会显示所有人都在第一手使用剑or,所以也会出现不使用 2 剑的人。

我不知道如何选择玩家姓名和等级一次(因为当他们使用 2 把剑时,他们的名字会出现两次而不是一次),所以检查他们的双手,如果他们双手都有剑,请​​显示他们的名字和水平。

标签: sqlsql-serverinner-joinwhere-clausehaving-clause

解决方案


您想检查属于给定字符的组是否满足条件,这表明聚合: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条件


推荐阅读