在我正在重构的 MMORPG 服务器中,我有两个表。一种用于元素,一种用于法术。每个项目最多有 5 个法术,所以我采用了稀疏矩阵格式,有 5 列用于法术 ID。
该结构的最初设计者选择使用不支持引用的 MyISAM,导致项目表包含具有不存在的法术 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 个 spellid 列 - 即通过一个 item_spell 表格允许每个项目有任意数量的拼写。除了更具前瞻性(当您发现现在需要 6 个法术)之外,您的查询将变为:
SELECT COUNT(DISTINCT item_id)
FROM item_spells
WHERE spell_id NOT IN (SELECT entry FROM research.spell);
实际上,您必须执行 5 次检查。
关于sql - 避免在一个查询中多次使用同一个子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1147180/