0

リストからできるだけ多くのアイテムの所有者を見つけようとしています。

次のようになります。

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 のメンバーがあります。必要な出力? そのリストから最も多くのアイテムを持っているプレイヤー名のリスト

4

3 に答える 3

1

質問の詳細(テーブル構造、サンプルデータ、必要な出力など)なしで具体的な答えを出すことは不可能ですが、行間を読むと、lookId基準をwhere句に追加することをお勧めします-

SELECT
    `Players`.`name`,
    COUNT(`lookId`) AS `num_items`
FROM `Items`
INNER JOIN `Players` ON `Players`.`id` = `Items`.`ownerId`
WHERE `Players`.`lvl` < Y
AND `lookId` IN (81411,81421 (lots of it) 81551,81611)
GROUP BY `ownerId`
ORDER BY `num_items` DESC
LIMIT 15
于 2013-01-31T18:53:38.920 に答える
0

このようなものが機能する可能性があります:

SELECT Players.`name` 
FROM `Items` INNER JOIN `Players` ON Players.`id` = Items.`ownerId`
WHERE Players.`lvl` < Y 
GROUP BY `ownerId` 
HAVING SUM(lookid) >= 
(select max(ownersum) - optional number goes here

from 

(select ownerid, sum(lookid) ownersum
FROM `Items` INNER JOIN `Players` ON Players.`id` = Items.`ownerId`
WHERE Players.`lvl` < Y 
group by ownerid
) 
)

私は実際にこれを試しませんでした。サブクエリの一方または両方にエイリアスが必要な場合があります。

于 2013-01-31T18:59:39.680 に答える
0

この時点で、そのリストで最も多くのアイテムを持っているプレイヤーを探しているのか、それともリストに X 個以上のアイテムを持っているプレイヤーを探しているのか、少し混乱しています。

前者の場合は、次の方法で十分です。

SELECT p.name,
       COUNT(*) itemCount
FROM   players p 
       JOIN items i ON p.id=i.ownerid 
WHERE  p.lvl < _your_Y-value_
       AND lookID IN ( _your_list_ )
GROUP BY i.ownerid
ORDER BY itemCount DESC
LIMIT 1
于 2013-01-31T19:07:25.540 に答える