Mysql:从列表中找到最多的所有者

时间:2013-01-31 18:23:35

标签: mysql sql query-optimization

我正在尝试从列表中找到尽可能多的项目的所有者。

现在看起来像:

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。

如果它将返回&gt; 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个成员。 要求输出?具有该列表中大部分项目的玩家姓名列表

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
) 
)

我实际上没有尝试过这个。一个或两个子查询可能需要别名。

答案 2 :(得分: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