sql - 如何使用条件检查两件事,当两件事为真时,它会提供信息
问题描述
我做了一个代码来告诉我一个 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 把剑时,他们的名字会出现两次而不是一次),所以检查他们的双手,如果他们双手都有剑,请显示他们的名字和水平。
解决方案
您想检查属于给定字符的组是否满足条件,这表明聚合: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
条件
推荐阅读
- maven - 在 Jenkins 管道中使用 build-helper-plugin 增加 Maven project.version
- android - Firebase:制作多语言通知
- node.js - Express 服务器:将现有文档克隆到另一个集合中
- vb.net - 如何获取字符串中的第一个数字和第二个数字?
- python - 如何检查 post_save 中的模型字段是否已更改?
- java - 如何为具有 Java Spring 安全性的用户授予权限
- node.js - 在 Azure SDK 中查询节点的可用位置
- ios - iOS 分发证书已被吊销。引起什么问题?
- c# - 时间:2019-05-10 标签:c#不断计算一些不同于它应该的东西
- c - 使用指针访问元素