2014-10-15 2 views
0

У меня есть таблица подпрограмм. В этой таблице у меня есть столбец «класс» (который не является обязательным) и столбец «дата». Кроме того, у меня есть несколько дней и массив идентификаторов пользователей. Мне нужен запрос, который возвращает мне последнюю подпрограмму, которая имеет значение! = Null для столбца «grade» и dateiff (current_date, date)> = number_of_days для каждого идентификатора в массиве и составляет в среднем все эти значения.запрос, который возвращает одну строку для каждого внешнего ключа

например.

today = 2014/10/15 

number_of_days = 10 

ids(1,3) 

процедуры

id | type | date  | grade | user_id 
1 | 1 | 2014-10-10 | 3  | 1 
2 | 1 | 2014-10-04 | 3  | 1 
3 | 1 | 2014-10-01 | 3  | 1 
4 | 1 | 2014-09-24 | 2  | 1 
5 | 1 | 2014-10-10 | 2  | 2 
6 | 1 | 2014-10-04 | 3  | 2 
7 | 1 | 2014-10-01 | 3  | 2 
8 | 1 | 2014-09-24 | 1  | 2 
9 | 1 | 2014-10-10 | 1  | 3 
10 | 1 | 2014-10-04 | 1  | 3 
11 | 1 | 2014-10-01 | 1  | 3 
12 | 1 | 2014-09-24 | 1  | 3 

В этом случае, мой запрос будет возвращать СРЕДНЕЕ между "классом" из строки ID # 2 и # 10

ответ

1

Я думаю, что вы говорите, что вы хотите рассматривать строки, имеющие ненулевые значения в столбце оценки, дату в течение заданного количества дней текущей даты и один из заданного набора user_ids. Среди этих строк для каждого user_id вы хотите выбрать строку с последней датой и вычислить среднее значение столбцов класса для этих строк.

Я предполагаю, что у вас не может быть двух строк с одинаковыми user_id и датой, как с ненулевыми оценками, так и с вопросом, который вы хотите задать, не имеет четко определенного ответа.

Запрос по этим линиям следует сделать трюк:

SELECT AVG(r.grade) AS average_grade 
    FROM 
    (SELECT user_id, MAX(date) AS date 
     FROM routines 
     WHERE grade IS NOT NULL 
     AND DATEDIFF(CURDATE(), date) >= 10 
     AND user_id IN (1,3) 
     GROUP BY user_id) AS md 
    JOIN routines r 
     ON r.user_id = md.user_id AND r.date = md.date 

Обратите внимание, что в принципе вам нужно grade IS NOT NULL условие на как внутренний и внешний запрос, чтобы выбрать правильные строки для среднего, но на практике AVG() игнорирует нули, поэтому вам не нужно отфильтровывать дополнительные строки во внешнем запросе.

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