在我重構的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