Мне нужен запрос для предотвращения объединения, которое дает 1.34218E + 35 результатов!
У меня есть стол item
(примерно 8 000 предметов; например, Щит Фу, Оружие Бар), и каждый предмет - один из 9 различных item_type
(Доспехи, Оружие и т. Д.). Каждый элемент имеет несколько записей в item_attribute
(например, урон, защита). Вот представление псевдокода:
Table item (
item_id autoincrement,
...
item_type_id char, --- e.g. Armor, Weapon, etc
level int --- Must be at least this level to wear this item
);
Table item_attribute (
item_id int references item(item_id),
...
attribute char --- e.g. Damage, Defense, etc
amount int --- e.g. 100
)
Теперь персонаж носит всего 9 предметов одновременно (по одному на каждый: Доспехи, Оружие, Щит и т. Д.), Которые я называю установкой . Я хочу создать список настроек, которые максимизируют атрибут, но имеют минимум другого атрибута. В качестве примера: для уровня персонажа 100 представьте лучшие 10 установок по урону, где sum(defense of all items) >= 100
.
Наивный подход:
select top 10
q1.item_id,q2.item_id,q3.item_id,..., q1.damage+q2.damage+q3.damage... as damage
from
(select item_id from item where item_type = 'Armor'
and level <= 100) as q1
inner join (select item_id from item where item_type = 'Shield'
and level <= 100) as q2 on 1 = 1
inner join (select item_id from item where item_type = 'Weapon'
and level <= 100) as q3 on 1 = 1
...
where
q1.defense+q2.defense+q3.defense+... >= 100
order by
q1.damage+q2.damage+q3.damage,... descending
Но, поскольку в item
имеется около 8 тыс. Элементов, это означает, что величина результатов, которые СУБД должна отсортировать, близка к 8000 ^ 9 = 1,34218E + 35 различных установок! Есть ли лучший способ?