我正在尝试从列表中找到尽可能多的项目的所有者。
现在看起来像:
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个成员。 要求输出?具有该列表中大部分项目的玩家姓名列表
答案 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