リストからできるだけ多くのアイテムの所有者を見つけようとしています。
次のようになります。
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 は、リストのサイズから計算されます。
項目には約 60 万行あります。
それを行う他の方法はありますか?現在は 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 のメンバーがあります。必要な出力? そのリストから最も多くのアイテムを持っているプレイヤー名のリスト