2013-04-24 1 views
2

У меня есть три таблицы:Добавить в общей сложности 3 строки для конкретного идентификатора

Студенты

------------------------------------------------------------- 
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. Параллельно Приседания

  3. Мощность Clean

  4. Всего вышеприведенном 3

Я могу успешно захватить верхний список для каждого конкретного лифт, используя следующий запрос:

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

Можете ли вы показать нам, как на самом деле будет выглядеть желаемый результат? – Strawberry

+0

Возможно, с более интересными данными о лифте, чем «каждый делает 185», так как это может не показать, что вы действительно хотите – Mikeb

ответ

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. 
+0

Это выводит верхний вес каждого ученика в каждом подъемнике, но не добавляет общее количество трех лифтов для каждого ученика , – SchoolTechie

+0

Обновлено, чтобы дать вам то, что вы хотели. – gbtimmon

+0

Это работает! Благодарю. – SchoolTechie

Смежные вопросы