sql - 避免在一个查询中多次使用同一个子查询

标签 sql mysql database

在我正在重构的 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/

相关文章:

MySQL 索引,单列还是多列?

mysql - 数据库设计 : how to store XML/JSON in database?

mysql - 创建表时出错

android - 尝试在 android 中创建表时出现 SQlite 异常

sql - tSQL 不在查询中

mysql - SQL查询以检查名称是否以元音开头和结尾

mysql - 在一个表中分配不同的多个外键与 MySQL 中的另一个表

sql表优化: primary and secondary indexes

mysql - 我知道 GUID 几乎是唯一的。但是假设它是独一无二的是可以接受的做法吗?

java - jooq 3.12.0 codegen 工具策略类未找到