我想知道是否有更有效的方法来找到我要的东西。
项目具有统计信息 统计信息存储在与item_id链接的单独表中。 一个项目将具有多个统计信息。
要删除具有特定统计信息的项目,我的代码会生成如下所示的SQL语句来查找这些项目。
SELECT *
FROM
(SELECT *
FROM
(SELECT *
FROM
(SELECT *
FROM items
WHERE items.item_type = :item_type
AND items.power_level < :power_level
AND items.power_level > :power_level_lowest) AS i
WHERE EXISTS (
SELECT id
FROM item_stat
WHERE item_stat.stat_id = :stat_1
AND i.id = item_stat.item_id)
) AS i1
WHERE EXISTS (
SELECT id
FROM item_stat
WHERE item_stat.stat_id = :stat_2
AND i1.id = item_stat.item_id)
) AS i2
WHERE EXISTS (
SELECT id
FROM item_sta
WHERE item_stat.stat_id = :stat_3
AND i2.id = item_stat.item_id)
ORDER BY power_level DESC;
是否有一种更快的方法来搜索另一个表中具有特定统计信息的项目,因此项目中大约有50万条记录。每个item_type介于50-80k之间,每个统计总计4-7。但搜索只需要验证一个项目具有1-4。
我正在使用MariaDB托管这些记录。该查询的工作时间比我想要的还要长。
要阐明要求: 有许多物品,其统计数据各不相同。 我想找到所有按功率级别排序的项目,这些项目必须至少包含指定的特定统计信息。
项目必须具有统计信息,但包含更多统计信息。现在,我正在使用一个单独的查询来检索完整的数据。
答案 0 :(得分:1)
您的查询不是很清楚,我可能误解了您的问题。但是据我了解,我认为您只需执行几个JOIN
操作就可以完成您想做的事情:
SELECT items.*
FROM items
JOIN item_stat AS stat1
ON stat1.stat_id = :stat_1
AND stat1.item_id = items.id
JOIN item_stat AS stat2
ON stat2.stat_id = :stat_2
AND stat2.item_id = items.id
JOIN item_stat AS stat3
ON stat3.stat_id = :stat_3
AND stat3.item_id = items.id
WHERE items.item_type = :item_type
AND items.power_level < :power_level
AND items.power_level > :power_level_lowest
ORDER BY items.power_level DESC;
如果这不能按您希望的那样工作,您能否用一些items
和item_stat
数据示例以及预期结果来更新您的问题?