我正在尝试从列表中找到尽可能多的项目的所有者。
现在看起来像:
SELECT Players.`name` FROM `Items` INNER JOIN `Players` ON Players.`id` = Items.`ownerId`
WHERE Players.`lvl` < Y
GROUP BY `ownerId` HAVING SUM(lookId IN(81411,81421 (lots of it) 81551,81611)) > X
它返回列表中拥有超过 X 个项目的玩家的姓名。
如果它不会返回任何行,这意味着我们需要太多的项目,所以我用 X-1 再试一次。
如果它将返回 >15 行,我们可以尝试从列表中查找拥有超过 X+1 个项目的玩家。
起始 X 是根据列表的大小计算的。
项目有大约 600k 行。
还有其他方法吗?现在需要> 1秒,所以当启动X错误时,整个过程可能需要几秒钟......
编辑:
项目:
CREATE TABLE IF NOT EXISTS `Items` (
`id` int(11) NOT NULL,
`ownerId` int(11) NOT NULL,
`itemType` int(11) NOT NULL,
`itemClass` int(11) NOT NULL,
`itemId` int(11) NOT NULL,
`itemColor` int(11) NOT NULL,
`attrId1` int(11) NOT NULL,
`attrId2` int(11) NOT NULL,
`attrId3` int(11) NOT NULL,
`attr1` int(11) NOT NULL,
`attr2` int(11) NOT NULL,
`attr3` int(11) NOT NULL,
`isArtifact` tinyint(1) NOT NULL,
`armor` int(11) NOT NULL,
`minDmg` int(11) NOT NULL,
`maxDmg` int(11) NOT NULL,
`lookId` mediumint(7) NOT NULL,
PRIMARY KEY (`id`,`ownerId`),
KEY `ownerId` (`ownerId`),
KEY `lookId` (`lookId`)
) ENGINE=InnoDB;
我不明白样本数据和所需输出的意思。查询看起来和这个完全一样,只是 IN() 列表有 1 到 3200 个成员。需要的输出?列表中包含最多项目的玩家名称列表