У меня есть одна таблица, в которой есть оценки людей.MYSQL присоединение проблемы подзапроса
+---------+--------+--------+--------+---------------------+
| name | grade1 | grade2 | grade3 | datetime |
+---------+--------+--------+--------+---------------------+
| person1 | 50 | 80 | 100 | 2015-05-05 12:00:00 |
| person1 | 60 | 43 | 88 | 2015-05-05 12:00:00 |
| person1 | 11 | 80 | 44 | 2015-05-05 12:00:00 |
| person1 | 64 | 75 | 37 | 2015-05-05 12:00:00 |
| person1 | 83 | 34 | 99 | 2015-05-05 12:00:00 |
| person2 | 45 | 100 | 95 | 2015-05-05 12:00:00 |
| person2 | 76 | 75 | 54 | 2015-05-05 12:00:00 |
| person2 | 68 | 53 | 66 | 2015-05-05 12:00:00 |
| person2 | 45 | 12 | 85 | 2015-05-05 12:00:00 |
| person2 | 75 | 78 | 55 | 2015-05-05 12:00:00 |
+---------+--------+--------+--------+---------------------+
Что мне нужно сделать, это тянуть оценки человека в определенный день, а затем строка, представляющая их годен/негоден отчет от предыдущего (до 7) дней.
Конечный результат я бы искал на основе со стола будет что-то вроде этого:
+---------------+---------+--------+--------+--------+----------------+
| report | name | grade1 | grade2 | grade3 | datetime |
+---------------+---------+--------+--------+--------+----------------+
| pass:3 fail:2 | person1 | 50 | 80 | 100 | 5/5/2015 12:00 |
| pass:2 fail:3 | person2 | 42 | 100 | 95 | 5/5/2015 12:00 |
+---------------+---------+--------+--------+--------+----------------+
Так что мой SQL, чтобы получить первую часть довольно проста:
SELECT *
FROM Grades.grade_table gt
WHERE gt.datetime = '2015-05-05 12:00:00'
Второй часть моего запроса выглядит следующим образом:
SELECT CONCAT('fail:',SUM(CASE WHEN pass_fail = 'fail' THEN 1 ELSE 0 END),' pass:',SUM(CASE WHEN pass_fail = 'pass' THEN 1 ELSE 0 END)) trend_data
FROM (
SELECT
CASE
WHEN ((grade1+grade2+grade3)/3) >= 65 THEN 'pass'
ELSE 'fail'
END AS pass_fail
FROM Grades.grade_table gt
WHERE gt.name = 'person1'
LIMIT 7
) trend_data
Что я пробовал:
SELECT
(
SELECT CONCAT('fail:',SUM(CASE WHEN pass_fail = 'fail' THEN 1 ELSE 0 END),' pass:',SUM(CASE WHEN pass_fail = 'pass' THEN 1 ELSE 0 END)) trend_data
FROM (
SELECT
CASE
WHEN ((grade1+grade2+grade3)/3) >= 65 THEN 'pass'
ELSE 'fail'
END AS pass_fail
FROM Grades.grade_table gt
WHERE gt.name = original_data.name
LIMIT 7
) trend_data
) AS trending_data, original_data.*
FROM
(
SELECT *
FROM Grades.grade_table gt
WHERE gt.datetime = '2015-05-05 12:00:00'
)
Я все время не могу найти исходное_значение в предложении where, но я думал, что это произойдет, поскольку он находится в отдельном элементе, который является псевдонимом.
Я создал здесь скрипт sql, если он вообще помогает: sqlfiddle.com/#!9/ac6d0/10/0 – CarlyL
Я обновил свой ответ. Он должен соответствовать вашим требованиям сейчас. – mwilczynski