На сервере 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);
Есть ли более элегантный способ сделать это?
РЕДАКТИРОВАТЬ: NULL spellid_n считается действительным, поскольку это просто означает, что у предмета нет заклинания в этом слоте.