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 是根据列表的大小计算的。

项目有大约 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 个成员。需要的输出?列表中包含最多项目的玩家名称列表

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 回答