2016-01-12 3 views
0

Я собрал небольшой sql-запрос, который выводит данные из одной таблицы и сортирует их под новыми именами столбцов. SQL выглядит следующим образом:MySQL SELECT to VIEW возвращает разные результаты

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

Каково ваше мнение? - Я имею в виду код для вида –

+0

@ DanielCasserly Я обновил сообщение –

ответ

2

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

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, поэтому ваш первый запрос не совсем то, что входит в представление. В любом случае исправьте это, используя более простой запрос.

+0

О, ничего себе, это красиво. Делает гораздо больше смысла и является гораздо более элегантным решением. Благодаря! Задача решена! –