在我重构的MMORPG服务器中,我有两个表。一个用于物品,一个用于法术。每个物品最多有5个法术,所以我采用了稀疏矩阵格式,其中有5列用于拼写ID。避免在查询中多次使用相同的子查询
该结构的原始设计者选择使用不支持引用的MyISAM,从而导致items表中包含具有不存在拼写ID的项目。我希望找出哪些项目具有不正确的拼写ID以便修复它们,并且可能最终转换为InnoDB。
到目前为止,我已经能够想出只有这个:
SELECT COUNT(*)
FROM items
WHERE spellid_1 NOT IN (SELECT entry FROM research.spell)
OR spellid_2 NOT IN (SELECT entry FROM research.spell)
OR spellid_3 NOT IN (SELECT entry FROM research.spell)
OR spellid_4 NOT IN (SELECT entry FROM research.spell)
OR spellid_5 NOT IN (SELECT entry FROM research.spell);
有没有更优雅的方式来做到这一点?
编辑: NULL spellid_n算作是有效的,因为它只是意味着该项目没有在插槽中的法术。
没错,但绝不会有每个项目超过5个法术,和普通的用例是在它的全部,所以我仍然相信稀疏获取项目矩阵更适合这一点。 – MoshiBin 2009-07-18 11:27:45
@Spidey与水不同,specs很少冻结。我会建议遵循托尼的建议来规范和面向未来。 – 2009-07-20 08:31:12
已投票。不回答这个问题。 – hobodave 2009-07-22 13:59:28