MySQL SELECT to VIEW возвращает разные результаты

Я собрал небольшой SQL-запрос, который собирает данные из одной таблицы и сортирует их по новым именам столбцов. Sql выглядит так:

SELECT course_id AS course, NOW() as datum,
(SELECT COUNT(*) FROM users_courses WHERE course_id = course) AS antal_registrerade,
(SELECT COUNT(*) FROM users_courses WHERE status = 1 AND course_id = course) AS antal_aktiva,
(SELECT COUNT(*) FROM users_courses WHERE status = 3 AND course_id = course) AS antal_avklarade
FROM users_courses GROUP BY course_id

Приведенный выше запрос возвращает следующее:

| course | datum               | antal_registrerade | antal_aktiva  | antal_avklarade   |
-----------------------------------------------------------------------------------------
| 31     | 2016-01-12 16:24:58 | 142                | 19            | 83                |
| 38     | 2016-01-12 16:24:58 | 826                | 45            | 49                |
| 39     | 2016-01-12 16:24:58 | 2                  | 2             | NULL              |
| 43     | 2016-01-12 16:24:58 | 169                | 29            | 32                |
| 44     | 2016-01-12 16:24:58 | 11                 | 4             | 2                 |
| 45     | 2016-01-12 16:24:58 | 67                 | 8             | 7                 |
| 46     | 2016-01-12 16:24:58 | 2                  | 1             | 1                 |   

Все хорошо, верно? Как я и хотел. НО, когда я сохраняю этот запрос как представление и запускаю, результат будет другим. Я получаю одинаковые данные для каждой строки, кроме столбцов курса и базовых данных.

| course | datum               | antal_registrerade | antal_aktiva  | antal_avklarade   |
-----------------------------------------------------------------------------------------
| 31     | 2016-01-12 16:24:58 | 1219               | 108           | 174               |
| 38     | 2016-01-12 16:24:58 | 1219               | 108           | 174               |
| 39     | 2016-01-12 16:24:58 | 1219               | 108           | 174               |
| 43     | 2016-01-12 16:24:58 | 1219               | 108           | 174               |
| 44     | 2016-01-12 16:24:58 | 1219               | 108           | 174               |
| 45     | 2016-01-12 16:24:58 | 1219               | 108           | 174               |
| 46     | 2016-01-12 16:24:58 | 1219               | 108           | 174               |   

Кто-нибудь есть идеи, почему это? SQL, найденный в сохраненном виде, выглядит следующим образом:

SELECT `database`.`users_courses`.`course_id` AS `course`,now() AS `datum`,
(SELECT COUNT(0) from `database`.`users_courses` where (`database`.`users_courses`.`course_id` = `database`.`users_courses`.`course_id`)) AS `antal_registrerade`,
(SELECT COUNT(0) from `database`.`users_courses` where ((`database`.`users_courses`.`status` = 1) and (`database`.`users_courses`.`course_id` = `database`.`users_courses`.`course_id`))) AS `antal_aktiva`,
(SELECT COUNT(0) from `database`.`users_courses` where ((`database`.`users_courses`.`status` = 3) and (`database`.`users_courses`.`course_id` = `database`.`users_courses`.`course_id`))) AS `antal_avklarade`
FROM `database`.`users_courses`
GROUP BY `database`.`users_courses`.`course_id`

1 ответ

Решение

Это гораздо проще выразить с помощью условного агрегирования:

SELECT course_id AS course, NOW() as datum,
       COUNT(*) as antal_registrerade,
       SUM(status = 1) as antal_aktiva,
       SUM(status = 3) AS antal_avklarade
FROM users_courses
GROUP BY course_id;

Это должно исправить проблему с вашими результатами.

По какой-то причине в сохраненном коде для представления предложение корреляции неверно. Я предполагаю, что у вас нет двух столбцов в таблице для course а также course_idТаким образом, ваш первый запрос не совсем то, что входит в представление. В любом случае, исправьте это, используя более простой запрос.

Другие вопросы по тегам