На сервере MMORPG я рефакторинг, у меня есть две таблицы. Один для предметов и один для заклинаний. Каждый предмет имеет до 5 заклинаний, поэтому я пошел с разреженным матричным форматом, имея 5 столбцов для идентификаторов заклинаний.Избегайте использования одного и того же подзапроса несколько раз в запросе
Первоначальные разработчики этой структуры решили использовать MyISAM, который не поддерживает ссылки, в результате чего таблица элементов содержит элементы с несуществующими идентификаторами заклинаний. Я хочу узнать, какие элементы имеют неправильные идентификаторы заклинаний, чтобы исправить их и, возможно, в конечном итоге конвертировать в 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);
Есть ли более элегантный способ сделать это?
EDIT: NULL spellid_n считается как действительным, так как это просто означает, что элемент не имеет заклинание в этом слоте.
Правда, но никогда не будет больше, чем 5 заклинаний за единицу, а также совместное использование регистра является извлечение элемента в полном комплекте, так что я до сих пор считаю, разреженный матрица лучше подходит для этого. – MoshiBin
@Spidey В отличие от воды, характеристики редко замерзают. Я бы посоветовал следовать совету Тони о нормализации и будущем. –
Проголосовали. Не отвечает на вопрос. – hobodave