在PHP中迭代MySQL结果时检测将来的重复值

在PHP中迭代MySQL结果时检测将来的重复值,php,mysql,Php,Mysql,我试图计算一个团队在有序MySQL结果集中的排名,我遇到的问题是检测第一个团队的排名是否与排名相同的值 例如,假设结果集如下所示: team_id pts --------------- 1 89 2 87 3 76 4 76 5 52 我使用以下PHP计算团队的排名: $i = 0; while($row = mysql_fetch_assoc($r)) { //iterate thru orde

我试图计算一个团队在有序MySQL结果集中的排名,我遇到的问题是检测第一个团队的排名是否与排名相同的值

例如,假设结果集如下所示:

team_id    pts
---------------
1          89
2          87
3          76
4          76
5          52
我使用以下PHP计算团队的排名:

$i = 0;
while($row = mysql_fetch_assoc($r)) { //iterate thru ordered (desc) SQL results
    ++$i;
    ($row['pts'] == $prev_val)
        ? $rnk = 'T-' . $rnk    //same as previous score, indicate tie
        : $rnk = $i;            //not same as previous score
    $rnk = str_replace('T-T-','T-',$rnk); //eliminate duplicative tie indicator
    if ($row['team_id'] == $team_id) { //current team in resultset matches team in question, set team's rank
        $arr_ranks['tp']['cat'] = 'Total Points';
        $arr_ranks['tp']['actual'] = number_format($row['pts'],1);
        $arr_ranks['tp']['league_rank'] = $rnk;
        $arr_ranks['tp']['div_rank'] = $div_rnk;
    }
    else if ($i == 1) { //current team is category leader (rank=1) and is not team in question, set current team as leader
        $arr_ranks['tp']['leader'] = "<a href='index.php?view=franchise&team_id=" . $row['team_id'] . "'>" . get_team_name($row['team_id']) . '</a> (' . number_format($row['pts'],1) . ')';
    }
    $prev_val = $row['pts']; //set current score as previous score for next iteration of loop
}
这将产生以下结果:

team_id    division_id   tot_wins  rnk
--------------------------------------
10         1             44        1
2          1             42        2
3          2             42        2
8          1             39        4
5          2             37        5
. . .
然而,我突然意识到我已经得到了这个结果集,而这个实际上并不能解决我的问题


为了避免混淆,我发布了。

我喜欢伊格纳西奥的答案链接。但是如果您仍然想使用PHP,您可以按分数收集排名,并为每个分数分配团队。这可能不是最有效的方法,但它会起作用

$ranks = array();
while ($row = mysql_fetch_assoc($result)) {
    $ranks[$row['pts']][] = $row['team_id'];
}
$ranks
将是一个看起来像

$ranks[89] = array(1);
$ranks[87] = array(2);
$ranks[76] = array(3,4);
$ranks[52] = array(5);

$ranks
上使用
foreach
,并仔细检查点数的上升或下降方向。您可以使用count()查看是否存在平局。

我喜欢Ignacio的答案链接。但是如果您仍然想使用PHP,您可以按分数收集排名,并为每个分数分配团队。这可能不是最有效的方法,但它会起作用

$ranks = array();
while ($row = mysql_fetch_assoc($result)) {
    $ranks[$row['pts']][] = $row['team_id'];
}
$ranks
将是一个看起来像

$ranks[89] = array(1);
$ranks[87] = array(2);
$ranks[76] = array(3,4);
$ranks[52] = array(5);
$ranks
上使用
foreach
,并仔细检查点数的上升或下降方向。您可以使用count()查看是否存在平局。

此问题已解决

查询:

SELECT a.team_id, a.wins, count(*) instances
FROM
    (SELECT
        s1.team_id,
        sum(s1.score>s2.score) wins
    FROM scoreboard s1
        LEFT JOIN scoreboard s2
            ON s1.year=s2.year
            AND s1.week=s2.week
            AND s1.playoffs=s2.playoffs
            AND s1.game_id=s2.game_id
            AND s1.location<>s2.location
    GROUP BY s1.team_id) AS a
    LEFT JOIN
        (SELECT
            sum(s1.score>s2.score) wins
        FROM scoreboard s1
            LEFT JOIN scoreboard s2
                ON s1.year=s2.year
                AND s1.week=s2.week
                AND s1.playoffs=s2.playoffs
                AND s1.game_id=s2.game_id
                AND s1.location<>s2.location
        GROUP BY s1.team_id) AS b
            ON a.wins = b.wins
GROUP BY a.team_id, b.wins
ORDER BY a.wins DESC;
然后,在PHP中,我将能够通过检查
$row['instances']>1

这个问题何时被解决来检测所有关系

查询:

SELECT a.team_id, a.wins, count(*) instances
FROM
    (SELECT
        s1.team_id,
        sum(s1.score>s2.score) wins
    FROM scoreboard s1
        LEFT JOIN scoreboard s2
            ON s1.year=s2.year
            AND s1.week=s2.week
            AND s1.playoffs=s2.playoffs
            AND s1.game_id=s2.game_id
            AND s1.location<>s2.location
    GROUP BY s1.team_id) AS a
    LEFT JOIN
        (SELECT
            sum(s1.score>s2.score) wins
        FROM scoreboard s1
            LEFT JOIN scoreboard s2
                ON s1.year=s2.year
                AND s1.week=s2.week
                AND s1.playoffs=s2.playoffs
                AND s1.game_id=s2.game_id
                AND s1.location<>s2.location
        GROUP BY s1.team_id) AS b
            ON a.wins = b.wins
GROUP BY a.team_id, b.wins
ORDER BY a.wins DESC;

然后,在PHP中,当
$row['instances']>1

可能不是时,我就可以通过检查来检测所有关系了!我试图寻找一个预先存在的解决方案,但没有遇到你的。让我试试看@IgnacioVazquez Abrams我在上面的问题中添加了一个查询,我正在努力实现您的解决方案。@IgnacioVazquez Abrams只是想澄清一下,我在上面的查询中实现您的
COUNT(*)…+1
解决方案时遇到了问题,因为我必须在查询本身中获得结果,而且不是从预先填充的表中。@IgnacioVazquez Abrams请查看我的最新编辑。即使有了您出色的排名解决方案,我的工作也没有完成。:)也许不是!我试图寻找一个预先存在的解决方案,但没有遇到你的。让我试试看@IgnacioVazquez Abrams我在上面的问题中添加了一个查询,我正在努力实现您的解决方案。@IgnacioVazquez Abrams只是想澄清一下,我在上面的查询中实现您的
COUNT(*)…+1
解决方案时遇到了问题,因为我必须在查询本身中获得结果,而且不是从预先填充的表中。@IgnacioVazquez Abrams请查看我的最新编辑。即使有了您出色的排名解决方案,我的工作也没有完成。:)乍一看,你会遇到同样的问题,重复组中的第一个分数没有被当作平局来抓。乍一看,你会遇到同样的问题,重复组中的第一个分数没有被当作平局来抓。看起来这会起作用,谢谢。我将尝试使Ignacio的解决方案起作用,因为我认为它将更加精简,但这也是一种合理的方法!别担心!我完全同意,如果您能在SQL级别完成这项工作,它可能会更高效。祝你好运看来这样行得通,谢谢。我将尝试使Ignacio的解决方案起作用,因为我认为它将更加精简,但这也是一种合理的方法!别担心!我完全同意,如果您能在SQL级别完成这项工作,它可能会更高效。祝你好运我认为在这里发布一个最小的解决方案会更有帮助。我点击了链接,没有任何东西在我身上弹出。我想在这里发布一个最简单的解决方案会更有帮助。我点击了链接,没有任何东西向我弹出。