【问题标题】:select row with the same value with limit for each of them选择具有相同值的行,每个行都有限制
【发布时间】:2017-10-10 15:00:00
【问题描述】:

您好,我在尝试根据最近 4 场比赛结果生成足球表时遇到问题 这是我用来根据所有结果生成表格的代码,它工作正常:

选择
    团队,
    计数(*)播放,
    计数(当目标 > 目标然后 1 结束时的情况)获胜,
    计数(目标反对> 目标然后 1 结束的情况)失败,
    计数(当目标 = 目标然后 1 结束时的情况)平局,
    sum(goalsfor) 目标,
    sum(goalsagainst) 目标,
    sum(goalsfor) - sum(goalsagainst) 目标差异,
    和(
          目标大于目标的情况,然后 3 else 0 结束
        + 目标时的情况 = 目标反对然后 1 否则 0 结束
    ) 分数
从 (
    从分数中选择主队、进球、进球
  联合所有
    从得分中选择客队、进球、进球
) 一种
按团队分组
按分数 desc 排序,goal_diff desc;

这是桌子

 标识 |主队 |离开 |目标|进球数|时间 |数据
 1 | A队| b组| 3 | 2 | 13:00| 2016-04-21
 2 | c组| b组| 4 | 1 | 13:00| 2016-04-19

我不知道如何为所有球队只选择最后 4 场比赛 最近一场 我试过这样:

( 从分数中选择主队、进球、进球 联合所有 从数据>2016-03-21的分数中选择客队,进球数,进球数 )

但有些球队在那段时间只打了一场比赛 4

【问题讨论】:

标签: mysql sql count rows


【解决方案1】:

为了扩展 @jarlh 的评论,大概你想要最后 4 场比赛,无论比赛是主场还是客场,所以你需要将结果“限制”到 [a]:

from (
    select hometeam team, goalsfor, goalsagainst, data from scores 
  union all
    select awayteam, goalsagainst, goalsfor, data from scores
) a order by data desc limit 4

【讨论】:

  • 我已经删除了我的评论,因为我可能误读了这个问题。
  • 这似乎绝对不可能。
【解决方案2】:

您的FROM 子查询几乎就在那里,但您需要包含日期。

from (
    select hometeam team, goalsfor, goalsagainst, date from scores 
     union all
    select awayteam team, goalsagainst, goalsfor, date from scores
) a 

现在您需要选择每支球队的最后 4 场比赛,为此您需要使用变量。

SELECT *
FROM (
    SELECT A.*, 
           @rn := IF( @team = team,
                      @rn + 1, 
                      IF( @team := team, 1, 1)
                    ) as rn
    FROM (
        select hometeam team, goalsfor, goalsagainst, date from scores 
         union all
        select awayteam team, goalsagainst, goalsfor, date from scores
    ) a
    CROSS JOIN ( SELECT @rn := 0, @team := '' ) as var
    ORDER BY team, date DESC 
   ) T
WHERE T.rn <= 4   
ORDER BY team, rn  

现在您可以对该结果进行聚合:

SELECT team, count(*), .....
FROM ( /* previous query */ )  as F
GROUP BY team 

【讨论】:

  • 它不能正常工作仍然显示所有玩过的游戏但计算错误
  • 你能告诉我中间查询的结果和变量吗?使用senseful.github.io/web-tools/text-table 并发送一个粘贴箱或类似的东西,以便可以复制粘贴。不是图片
  • 再查,我忘了ORDER BY team
【解决方案3】:

这是整个代码的输出

+---+---------------------------------- --------------------------+ | |一个 | +---+---------------------------------- --------------------------+ | 1 |球队出战胜负平局进球对进球_diff 得分| | 2 |切尔西 708 272 272 164 976 976 0 980 | +---+---------------------------------- --------------------------+

这是你问的中间部分的部分输出

+-------------------+---+---+----------+---+ |切尔西 | 3 | 0 | 2017 年 5 月 8 日 | 1 | |米德尔斯堡 | 0 | 3 | 2017 年 5 月 8 日 | 1 | |利物浦 | 0 | 0 | 2017 年 5 月 7 日 | 1 | |阿森纳 | 2 | 0 | 2017 年 5 月 7 日 | 1 | |南安普敦 | 0 | 0 | 2017 年 5 月 7 日 | 1 | |曼联 | 0 | 2 | 2017 年 5 月 7 日 | 1 | |伯恩茅斯 | 2 | 2 | 2017 年 5 月 6 日 | 1 | |桑德兰 | 2 | 0 | 2017 年 5 月 6 日 | 1 | |斯旺西 | 1 | 0 | 2017 年 5 月 6 日 | 1 | |西布朗 | 2 | 2 | 2017 年 5 月 6 日 | 1 | |斯托克城 | 2 | 2 | 2017 年 5 月 6 日 | 1 | |曼城 | 5 | 0 | 2017 年 5 月 6 日 | 1 | |埃弗顿 | 0 | 1 | 2017 年 5 月 6 日 | 1 | |莱斯特 | 3 | 0 | 2017 年 5 月 6 日 | 1 | |赫尔城 | 0 | 2 | 2017 年 5 月 6 日 | 1 | |水晶宫 | 0 | 5 | 2017 年 5 月 6 日 | 1 | |伯恩利 | 2 | 2 | 2017 年 5 月 6 日 | 1 | |沃特福德 | 0 | 3 | 2017 年 5 月 6 日 | 1 | |西汉姆 | 1 | 0 | 2017 年 5 月 5 日 | 1 | |热刺 | 0 | 1 | 2017 年 5 月 5 日 | 1 | |沃特福德 | 0 | 1 | 2017 年 5 月 1 日 | 1 | |利物浦 | 1 | 0 | 2017 年 5 月 1 日 | 1 | +-------------------+---+---+----------+---+

它说总共有 708 行

【讨论】:

  • 您可以在查询中添加ORDER BY team, rn 吗?
猜你喜欢
  • 1970-01-01
  • 2012-03-03
  • 2016-12-25
  • 2022-08-17
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多