【问题标题】:SQL query with ORDER BY inside two different groups在两个不同组内使用 ORDER BY 的 SQL 查询
【发布时间】:2012-09-19 19:28:19
【问题描述】:

假设我有一张简单的 NBA 球员表:

id,player,mp,ppg(mp - 比赛场次,ppg - 每场得分)。

我需要一个查询来获取所有的人,但将结果分成两部分:

  • 参加过 PPG desc 排序的比赛超过或等于 30 场的玩家,
  • 按 PPG desc 排序的游戏少于 30 场的玩家

如此理想的输出将是(示例):

n. player    mp ppg

1. player1   82 32.5
2. player2   56 32.1
3. player3   82 29.7
4. player4   80 27.6

...

70. player70 75 1.5  (lowest in the 30+ games group)
71. player71 29 35.7 (highest in the less than 30 games group)
72. player72 19 31.3

...

第 1 组)排在第一位(更重要),因此即使第 2 组中的 PPG 高于第 1 组中最好的 PPG),它也会在球员参加超过 30 场比赛的组中最差的 PPG 之后下降。

有没有办法在一个查询中做到这一点?我正在使用 mySQL。谢谢!

【问题讨论】:

  • 我认为您的描述中有错字,您说在这两种情况下两者都是ordered by PPG desc?!

标签: mysql sql database


【解决方案1】:
select id, player, mp, ppg
from 
    playerTable
order by if (mp>=30, 1, 0) desc, ppg desc, mp desc`

【讨论】:

    【解决方案2】:
    SELECT * 
    FROM tablename
    ORDER BY
        CASE WHEN mp >= 30 THEN PPG END DESC,
        CASE WHEN mp < 30 THEN PPG END ASC
    

    【讨论】:

      【解决方案3】:

      假设 ppq 总是低于 1000000,这会起作用:

      SELECT 
        * -- or whatever you want
      FROM players
      ORDER BY IF(mp>=30,1000000+ppg,mp) desc
      

      假设第二组按mp desc 排序(如示例),而不是按ppg(如文本)

      【讨论】:

        【解决方案4】:

        先按 MP>30,然后按 PPG

        ORDER BY (CASE WHEN mp >= 30 THEN 1 ELSE 2 END) ASC, PPG DESC
        

        【讨论】:

          【解决方案5】:
          select player, mp, ppg
          from t
          order by mp < 30, ppg desc
          

          【讨论】:

            猜你喜欢
            • 2023-03-24
            • 2022-01-15
            • 1970-01-01
            • 2010-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-21
            • 2011-07-19
            相关资源
            最近更新 更多