2015-09-08 188 views
0

我花了这么多时间搜索今天,但我甚至不知道要使用哪些关键字。所以...合并2 SQL查询/表

该项目是一个博彩游戏(足球)的评价。我有2个SQL查询:

SELECT players.username, players.userid, matchdays.userid, matchdays.points, SUM(points) AS gesamt 
FROM players INNER JOIN matchdays ON players.userid = matchdays.userid AND matchdays.season_id=5 
      GROUP BY players.username 
      ORDER BY gesamt DESC 

我的第二个查询:

SELECT max(matchday) as lastmd, points, players.username from players INNER JOIN matchdays ON players.userid = matchdays.userid WHERE matchdays.season_id=5 AND matchday= 
(select max(matchday) from matchdays)group by players.username ORDER BY points DESC 

一是增加了每个比赛日的点和显示的总和。 第二场显示了上一场比赛的积分。

我的目标是要合并的2查询/表,以便输出类似

排名表|用户名|积分上一场比赛|总体积分|

我甚至不知道从哪里开始或寻找什么。任何帮助,将不胜感激;)

+0

可能有人需要把'@变量'(即'set @rownum:= 1')连接在一起。所以也许搜索mysql rownum – Drew

+0

所以第二个查询获取表中最后一个比赛日的数据。有些玩家可能有那天的数据,有些则没有。是?什么是matchdays表的天然独特钥匙?每个用户和比赛日是否有一个条目?或者每个用户和每天都有更多的条目? –

回答

0

你可以使用条件聚合,即总结的要点,只有当这一天是最后一天:

SELECT 
    p.username, 
    SUM(case when m.matchday = (select max(matchday) from matchdays) then m.points end) 
    AS last_day_points, 
    SUM(m.points) AS total_points 
FROM players p 
INNER JOIN matchdays m ON p.userid = m.userid AND m.season_id = 5 
GROUP BY p.userid 
ORDER BY total_points DESC; 

或用代替连接一个非相关子查询(MySQL的应该得出相同的执行计划):

SELECT 
    p.username, 
    SUM(case when m.matchday = last_day.matchday then m.points end) AS last_day_points, 
    SUM(m.points) AS total_points 
FROM players p 
INNER JOIN matchdays m ON p.userid = m.userid AND m.season_id = 5 
CROSS JOIN 
(
    select max(matchday) as matchday 
    from matchdays 
) last_day 
GROUP BY p.userid 
ORDER BY total_points DESC; 
+0

非常感谢!像魅力一样工作! – Rouven

1

同时使用的查询与加盟....使用内部联接如果每个用户ID在第二个查询值also.also在第二查询添加用户标识也加入

SET @rank = 0; 

    SELECT @rank := rank + 1, 
       t1.username, 
       t2.points, 
       t1.gesamt 
    FROM  (
        SELECT players.username, players.userid puserid, matchdays.userid muserid, matchdays.points, SUM(points) AS gesamt 
        FROM  players INNER JOIN matchdays ON players.userid = matchdays.userid AND matchdays.season_id=5 
       GROUP BY players.username   
      )t1 
       INNER JOIN 
       ( 
       SELECT players.userid, max(matchday) as lastmd, points, players.username 
        from players INNER JOIN matchdays ON players.userid = matchdays.userid 
        WHERE matchdays.season_id=5 AND matchday= 
        (select max(matchday) from matchdays)group by players.username 
       )t2 
       ON t1.puserid = t2.userid 
    ORDER BY t1.gesamt