SQL中的NHL排名

时间:2015-12-25 02:58:38

标签: mysql sql sorting

我有一个SQL查询,它根据旧的NHL格式产生团队排名。

第一部分代码获得每个部门的前三个团队,第二部分获得其余部分按点/差分对它们进行排序。

这可以在这里看到:http://rgmgstandings.tk

这是我的SQL查询:

("(SELECT *, 1 as `SortKey` from `standings_east` 
        WHERE pts = (select max(pts) 
            from standings_east as t 
    where t.`div` = standings_east.`div`))

UNION ALL 

(select *, 2 as SortKey from `standings_east` 
        where team not in 
            (select team from standings_east 
                where pts = (select max(pts) 
                    from standings_east as t 
                        where t.`div` = standings_east.`div`))) 
        order by SortKey, pts desc, diff desc") 

如果您访问我的网站,并查看西部联盟的排名(蓝色横幅),您会发现“CEN”中有3支具有相同分数的球队(芝加哥,温尼伯,哥伦布)

standings

我希望查询只根据拥有最多“Wins / W”的人从该部门中选择一个团队。

正确的排名应该是:

埃德蒙顿(NW)80
阿纳海姆(PAC)74
哥伦布(CEN)71
达拉斯(PAC)73
芝加哥(CEN)71
温尼伯(CEN)71

我该如何做到这一点?

2 个答案:

答案 0 :(得分:2)

查询

select team,`div`,pts,1 as sortOrder 
from 
(   -- note use parentheses to avoid mysql error 1221
    (select team,`div`,pts,@cen:=team from `standings_west` where `div`='CEN' order by pts desc limit 1) 
    union all 
    (select team,`div`,pts,@pac:=team from `standings_west` where `div`='PAC' order by pts desc limit 1) 
    union all 
    (select team,`div`,pts,@nw:=team from `standings_west` where `div`='NW' order by pts desc limit 1) 
) xDerived1 
cross join (select @cen='',@pac='',@nw='') params 
union 
select team,`div`,pts,sortOrder 
from 
(   select team,`div`,pts,2 as sortOrder 
    from `standings_west` 
    where team!=@cen and team!=@pac and team!=@nw 
    order by pts desc 
    limit 3 
) xDerived2 
order by sortOrder,pts desc;

结果

+----------+-----+-----+-----------+
| team     | div | pts | sortOrder |
+----------+-----+-----+-----------+
| EDMONTON | NW  |  80 |         1 |
| ANAHEIM  | PAC |  74 |         1 |
| WINNIPEG | CEN |  71 |         1 |
| DALLAS   | PAC |  73 |         2 |
| CHICAGO  | CEN |  71 |         2 |
| COLUMBUS | CEN |  71 |         2 |
+----------+-----+-----+-----------+

存储过程

以下描述了一个存储过程,只是为了表明你遇到问题并需要它。

drop procedure if exists xdoit;
delimiter $$
create procedure xdoit()
begin
select team,`div`,pts,1 as sortOrder 
from 
(   -- note use parentheses to avoid mysql error 1221
    (select team,`div`,pts,@cen:=team from `standings_west` where `div`='CEN' order by pts desc limit 1) 
    union all 
    (select team,`div`,pts,@pac:=team from `standings_west` where `div`='PAC' order by pts desc limit 1) 
    union all 
    (select team,`div`,pts,@nw:=team from `standings_west` where `div`='NW' order by pts desc limit 1) 
) xDerived1 
cross join (select @cen='',@pac='',@nw='') params 
union 
select team,`div`,pts,sortOrder 
from 
(   select team,`div`,pts,2 as sortOrder 
    from `standings_west` 
    where team!=@cen and team!=@pac and team!=@nw 
    order by pts desc 
    limit 3 
) xDerived2 
order by sortOrder,pts desc;
end$$
delimiter ;

调用存储过程

call xdoit();

这里有一些评论。

首先,你的sqlfiddle有来自西方的数据,但来自东方的查询。根据表名,我建议您将所有数据放在一个表中,而不是两个,并且有一个东或西的列。

该查询使用交叉联接来仅仅建立用于抓取部门领导者的变量,以便排序领导者被排除在sortOrder = 2团队之外。

根据需要调整抢七局(即:有71分的球队)关于你在@Clockwork的评论中实施DIFF

询问您是否有任何问题。

以下是我根据您在该聊天室发布评论而为您提出的multi_query php解决方案。

我能想出的唯一解决方案是基于以下结果,结果显示两个结果集中的结果。因此whilenext_result()驱动的cross join循环。第一个结果集具有前3行,第2个结果集具有后面的12行。这就是PHP看起来的方式。

另请注意,在PHP部分中,由于我似乎正在处理multi_query,因此我利用了这一点并传递了mysql参数而不是执行<!DOCTYPE html> <html lang="en"> <head> <title>RGMG: Standings</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> </head> <body> <?php //mysqli_report(MYSQLI_REPORT_ALL); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); error_reporting(E_ALL); // report all PHP errors ini_set("display_errors", 1); try { $mysqli= new mysqli('localhost', 'dbUser', 'thePassword', 'theDbName'); echo "<table><div><br><br>"; // note you had this line a little bit wrong // notice below the concat of the $sql and the multi_query() $sql = "set @cen:='',@pac:='',@nw:=''; "; $sql .= "select * from ( select team,`div`,gp,win,lose,otl,goalsF,goalsA,diff,gpg,gaa,pts,1 as sortOrder from ( -- note use parentheses to avoid mysql error 1221 (select team,`div`,gp,win,lose,otl,goalsF,goalsA,diff,gpg,gaa,pts,@cen:=team from `standings_west` where `div`='CEN' order by pts desc, win desc, diff desc limit 1) union all (select team,`div`,gp,win,lose,otl,goalsF,goalsA,diff,gpg,gaa,pts,@pac:=team from `standings_west` where `div`='PAC' order by pts desc, win desc, diff desc limit 1) union all (select team,`div`,gp,win,lose,otl,goalsF,goalsA,diff,gpg,gaa,pts,@nw:=team from `standings_west` where `div`='NW' order by pts desc, win desc, diff desc limit 1) ) xDerived1 union all select team,`div`,gp,win,lose,otl,goalsF,goalsA,diff,gpg,gaa,pts,sortOrder from ( select team,`div`,gp,win,lose,otl,goalsF,goalsA,diff,gpg,gaa,pts,2 as sortOrder from `standings_west` where team!=@cen and team!=@pac and team!=@nw order by pts desc ) xDerived2 ) xDerived3 order by sortOrder,pts desc"; echo "<div class='container'>"; echo "<img src='http://i.imgur.com/sjDHhIV.png' width='100%' alt='West'>"; echo "<table class='table table-condensed'> <tr class='top'> <th class='rank'></th> <th class='team'>TEAM</th> <th>DIV</th> <th>GP</th> <th>W</th> <th>L</th> <th class='otl'>OTL</th> <th class='pts'>PTS</th> <th>GF</th> <th>GA</th> <th>DIFF</th> <th>GPG</th> <th>GAA</th> "; $counter=1; $mysqli->multi_query($sql); while(true) { if ($result = $mysqli->store_result()) { while ($row = $result->fetch_assoc()) { $gpg = ($row['goalsF']); $gaa = ($row['goalsA']); if ($row['gp'] != 0 ){ $gpg = ($row['goalsF'] / $row['gp']); $gaa = ($row['goalsA'] / $row['gp']); } else { $row['gp'] = ""; } echo "<tr> <td class='rank'>" . "$counter" . "</td> <td class='team'>" . $row['team'] . "</td> <td>" . $row['div'] . "</td> <td>" . $row['gp'] . "</td> <td>" . $row['win'] . "</td> <td>" . $row['lose'] . "</td> <td class='otl'>" . $row['otl'] . "</td> <td class='pts'>" . $row['pts'] . "</td> <td>" . $row['goalsF'] . "</td> <td>" . $row['goalsA'] . "</td> <td>" . $row['diff'] . "</td> <td>" . round($gpg, 2) . "</td> <td>" . round($gaa, 2) . "</td>"; $counter++; } $result->free(); } if ($mysqli->more_results()) { $mysqli->next_result(); } else { break; } } echo "</table></div>"; $mysqli->close(); } catch (mysqli_sql_exception $e) { throw $e; } ?> </body> </html> 来获取它们。

PHP

EditText

enter image description here

答案 1 :(得分:1)

首先,我喜欢NHL,根据您的查询,我们可以说您向我们展示的桌子是standings_east,所以让我们试试这个:

#periodic task that run every minute
@periodic_task(run_every=(crontab(hour="*", minute="*", day_of_week="*")))
def news():
    '''
    Grab url
    '''
    logger.info("Start task")
    now =  datetime.now()
    urls = []
    urls.append(crawler()) #crawler return dic obj
    for url_dic in list(reversed(urls)):
        for title, url  in url_dict.items():
            #Save all the scrape url in database
            Url.objects.create(title=headline, url=url)

    logger.info("Task finished: result = %s" %url)

我认为有一些更好的方法,但这是最喜欢你的,最容易理解的只是在你的代码和圣诞快乐上添加一个小组