为特定ID添加总共3行

时间:2013-04-24 15:47:05

标签: mysql

我有三张桌子:

学生

-------------------------------------------------------------
studentId        first        last        gender        weight
-------------------------------------------------------------
1                John         Doe         m             185
2                John         Doe2        m             130   
3                John         Doe3        m             250

升降机

-------------------
liftId        name        
-------------------
1             Bench Press
2             Power Clean  
3             Parallel Squat
4             Deadlift
5             Shoulder Press

StudentLifts

------------------------------------------------
studentLiftId   studentId     liftId     weight 
------------------------------------------------
1                1            1          185
2                2            3          130   
3                3            1          190
4                1            2          120
5                2            1          155   
6                3            2          145
7                1            1          135
8                1            1          205   
9                2            3          200
10               1            3          150
11               2            2          110
12               3            3          250

我想有四个顶级名单:

  1. 卧推

  2. Parallel Squat

  3. 电源清洁

  4. 以上3

  5. 的总和

    我可以使用以下查询成功获取每个特定电梯的顶部列表:

    SELECT s.studentId, s.first, s.last, s.gender, s.weight, l.name, sl.weight 
    FROM Students s 
    LEFT JOIN (
      SELECT *
      FROM StudentLifts 
      ORDER BY weight DESC
      ) sl ON sl.studentId = s.studentId 
      LEFT JOIN Lifts l ON l.liftId = sl.liftId 
      WHERE l.name = 'Bench Press' 
      AND s.gender = 'm' 
      AND s.weight > 170 
      GROUP BY s.studentId 
      ORDER BY sl.weight DESC
    

    然而,我仍然坚持如何为每个学生增加每部电梯的最高总数。我怎样才能首先找到每个电梯中每个学生的最高总数,然后将它们相加以获得所有三部电梯的总数?

    修改

    我正在寻找的结果集如下:

    -------------------------------------------------
    studentId    first    last    weight
    -------------------------------------------------
    3            John     Doe3    585
    1            John     Doe     475
    2            John     Doe2    465
    

    我也忘了提到我实际上会喜欢两个名单,一个是170岁以上的学生,一个是170岁以下的学生。

1 个答案:

答案 0 :(得分:2)

SELECT -- join student a total weight to the student table 
    A.studentId,
    A.first,
    A.last,
    C.totalWeight
FROM 
    Student A,  
    (
         SELECT  -- for each studet add the max weights 
             sum(B.maxWeight) as totalWeight, 
             B.studentID
         FROM (
             SELECT  -- for each (student,lift) select the max weight 
                 max(weight) as maxWeight, 
                 studentId, 
                 liftID
             FROM 
                 StudentLifts
             GROUP BY 
                 studentId,
                 liftID
         ) B
         GROUP BY 
            studentId
     ) C
WHERE 
    A.studentID = C.studentId 
    -- AND A.weight >= 170
    -- AND A.weight < 170
            -- pick one here to generate on of the two lists.