Mysql d综合指数(玩家id,值1,值2,值3)表现良好。我很想听听你的结果。它看起来真的很慢,不是吗?是的,这会有用的。但我不希望在大型数据集上使用这种方法。@Nemoden:使用复合索引(player\u id,value1,value2,value3)应该会
Mysql d综合指数(玩家id,值1,值2,值3)表现良好。我很想听听你的结果。它看起来真的很慢,不是吗?是的,这会有用的。但我不希望在大型数据集上使用这种方法。@Nemoden:使用复合索引(player\u id,value1,value2,value3)应该会,mysql,select,group-by,max,sql-order-by,Mysql,Select,Group By,Max,Sql Order By,d综合指数(玩家id,值1,值2,值3)表现良好。我很想听听你的结果。它看起来真的很慢,不是吗?是的,这会有用的。但我不希望在大型数据集上使用这种方法。@Nemoden:使用复合索引(player\u id,value1,value2,value3)应该会非常有效。它值得与任何其他解决方案进行基准测试。是的,从性能角度来看,它现在似乎更好了,并且似乎按照OP预期的+1工作。您的第一个解决方案实际上是有效的,这只是我的“事情”——关心性能:)这个解决方案非常有效!但是我担心性能,我需要对一个有数千
d综合指数
(玩家id,值1,值2,值3)
表现良好。我很想听听你的结果。它看起来真的很慢,不是吗?是的,这会有用的。但我不希望在大型数据集上使用这种方法。@Nemoden:使用复合索引(player\u id,value1,value2,value3)
应该会非常有效。它值得与任何其他解决方案进行基准测试。是的,从性能角度来看,它现在似乎更好了,并且似乎按照OP预期的+1工作。您的第一个解决方案实际上是有效的,这只是我的“事情”——关心性能:)这个解决方案非常有效!但是我担心性能,我需要对一个有数千行的表进行测试。@Morpheo17:正如前面提到的,您应该发现复合索引(player\u id,value1,value2,value3)
提供了良好的性能。我很想听听您的结果。-1如中所述:“服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。”。因此,不能依赖子查询中使用的ORDER BY
子句来确保根据需要从每个组中选择最大记录。-1如中所述:“服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。”。因此,不能依赖子查询中使用的ORDER BY子句来确保根据需要从每个组中选择最大记录。如果不知道最大分数,如?@eggyal,那么这将不起作用,不管怎样,我刚刚看到了您的解决方案,这会更好。如果不知道最大分数,作为?@eggyal,那么这就行不通了,不管怎样,我刚刚看到了你的解决方案,这就好多了。维护这样一个布尔列的问题在于,要确定哪条记录在每次更新时都保持新的“最佳分数”,需要付出代价。另一方面,一个合适的索引是一个有序的数据结构,它将(在任何给定的时间)能够用很少的计算工作量获取每个播放器的最大记录。因此,我提倡使用我的groupwise maximum解决方案的复合索引(player\u id,value1,value2,value3)
——它应该被证明是非常有效的。不过,对于您希望提供的任何与此相反的基准反馈,我们深表感谢!针对40000行的第一个快速基准测试,使用复合索引和无限制的查询。eqqyal的回答耗时约600毫秒,weicap的回答耗时380ms
。我知道,我需要对更大的数据库进行基准测试,但这第一次是有希望的…我对这些结果感到惊讶。。。你能为我的查询发布EXPLAIN
输出吗?@eggyal,你说得对,你的查询要快得多。您的解决方案是最佳解决方案维护这样一个布尔列的问题在于确定在每次更新时哪个记录保存新的“最佳分数”的成本。另一方面,一个合适的索引是一个有序的数据结构,它将(在任何给定的时间)能够用很少的计算工作量获取每个播放器的最大记录。因此,我提倡使用我的groupwise maximum解决方案的复合索引(player\u id,value1,value2,value3)
——它应该被证明是非常有效的。不过,对于您希望提供的任何与此相反的基准反馈,我们深表感谢!针对40000行的第一个快速基准测试,使用复合索引和无限制的查询。eqqyal的回答耗时约600毫秒,weicap的回答耗时380ms
。我知道,我需要对更大的数据库进行基准测试,但这第一次是有希望的…我对这些结果感到惊讶。。。你能为我的查询发布EXPLAIN
输出吗?@eggyal,你说得对,你的查询要快得多。您的解决方案是最佳解决方案第一个查询比第二个查询快两倍。我认为第一个查询是最好的解决方案。正如我在主要帖子上所说,weicap的解决方案是最快的查询。第一个查询比第二个查询快两倍。我认为第一个查询是最好的解决方案。正如我在我的主要帖子上所说的,weicap的解决方案是最快的查询。像往常一样,你比我优秀+1:)@eggyal:我不得不说我喜欢你的查询中的三重分组。像往常一样,你比我高+1:)@eggyal:我得说我喜欢你查询中的三重分组。
+------+-----------+--------+--------+--------+------------+
| id | player_id | value1 | value2 | value3 | date |
+------+-----------+--------+--------+--------+------------+
| 1 | 1 | 10 | 0 | 0 | 2012-08-02 |
+------+-----------+--------+--------+--------+------------+
| 2 | 2 | 15 | 1 | 0 | 2012-08-03 |
+------+-----------+--------+--------+--------+------------+
| 3 | 3 | 9 | 0 | 0 | 2012-08-04 |
+------+-----------+--------+--------+--------+------------+
| 4 | 1 | 11 | 0 | 0 | 2012-08-05 |
+------+-----------+--------+--------+--------+------------+
| 5 | 2 | 16 | 2 | 0 | 2012-08-06 |
+------+-----------+--------+--------+--------+------------+
| 6 | 2 | 15 | 0 | 0 | 2012-08-07 |
+------+-----------+--------+--------+--------+------------+
value1 = 15 value1 = 15
value2 = 1 is greater than -> value2 = 0
value3 = 0 value3 = 1
+------+-----------+--------+--------+--------+------------+
| id | player_id | value1 | value2 | value3 | date |
+------+-----------+--------+--------+--------+------------+
| 5 | 2 | 16 | 2 | 0 | 2012-08-06 |
+------+-----------+--------+--------+--------+------------+
| 4 | 1 | 11 | 0 | 0 | 2012-08-05 |
+------+-----------+--------+--------+--------+------------+
| 3 | 3 | 9 | 0 | 0 | 2012-08-04 |
+------+-----------+--------+--------+--------+------------+
SELECT id, player_id, value1, value2, value3
FROM scores
ORDER BY value1 DESC, value2 DESC, value3 DESC
//Extract Data Here
for($outI=0;$outI<count($scores);$outI++){
$scores[$outI]['bestScore'] = 0;
for($innI=0;$innI<=3;$innI++){
if ($scores[$outI]['value' . $innI+1] > $scores[$outI]['bestScore'])
$scores[$outI]['bestScore'] = $scores[$outI]['value' . $innI+1];
}
echo 'The best score for ' . $scores[$outI]['player_id'] . ' was ' . $scores[$outI]['bestScore'] . '.<br />';
}
SELECT * FROM Scores NATURAL JOIN (
SELECT player_id, value1, value2, MAX(value3) value3 FROM Scores NATURAL JOIN (
SELECT player_id, value1, MAX(value2) value2 FROM Scores NATURAL JOIN (
SELECT player_id, MAX(value1) value1 FROM Scores
GROUP BY player_id) t
GROUP BY player_id) t
GROUP BY player_id) t
ORDER BY value1 DESC, value2 DESC, value3 DESC
SELECT * FROM (
SELECT id, player_id, value1, value2, value3, `date`
FROM scores
ORDER BY value1 DESC, value2 DESC, value3 DESC
) x
GROUP BY player_id
order by value1 DESC, value2 DESC, value3 DESC
Select Scores.* from Scores, (SELECT player_id,max(17*17*value1+17*value2+value3)
as max_score FROM Scores group by player_id)t where
(17*17*value1+17*value2+value3) = t.max_score and Scores.player_id=t.player_id
SELECT player_id,
(SELECT value1
FROM Scores b where a.player_id=b.player_id ORDER BY value1 DESC, value2 DESC, value3 DESC limit 1) as value1,
(SELECT value2
FROM Scores b where a.player_id=b.player_id ORDER BY value1 DESC, value2 DESC, value3 DESC limit 1) as value2,
(SELECT value3
FROM Scores b where a.player_id=b.player_id ORDER BY value1 DESC, value2 DESC, value3 DESC limit 1) as value3
FROM Scores a GROUP BY player_id order by value1 DESC, value2 DESC, value3 DESC
SELECT * FROM Scores a
where id =(SELECT id
FROM Scores b where a.player_id=b.player_id ORDER BY value1 DESC, value2 DESC, value3 DESC limit 1)
GROUP BY player_id order by value1 DESC, value2 DESC, value3 DESC
SELECT
s.*
FROM
Scores AS s
JOIN
( SELECT DISTINCT
player_id
FROM
Scores
) AS p
ON s.id =
( SELECT
id
FROM
Scores AS b
WHERE
b.player_id = p.player_id
ORDER BY
value1 DESC, value2 DESC, value3 DESC
LIMIT 1
)
ORDER BY
s.value1 DESC, s.value2 DESC, s.value3 DESC ;