#mysql #view
#mysql — сервер #Вид #mysql
Вопрос:
Я действительно думаю, что вопрос, который у меня есть, не слишком конкретен, я просто не знаю, как это объяснить.
Допустим, у меня есть таблица со следующими столбцами
team | gameType | date | outcome
Я хотел бы создать представление, в котором перечислены некоторые статистические данные о командах
SELECT team, count(*) as FROM matches GROUP BY team ORDER BY total DESC
Теперь я хочу добавить столбцы, подсчитывающие общее количество
- какие были игры лиги
- которые были в прошлом месяце
- Победы
- потери
- связи
Цель состоит в том, чтобы создать представление в базе данных, а не какие-либо новые таблицы или столбцы.
Ответ №1:
Вы можете использовать операторы case в своих функциях агрегирования для агрегирования только для определенных событий.
SELECT
team,
count(*) total_matches,
count(case when gameType = 'league' then 1 end) league_matches,
count(case then date > now() - INTERVAL 30 DAY then 1 end) recent_matches,
...
FROM matches
GROUP BY team
Ответ №2:
Общая идея состоит в том, чтобы использовать выражение CASE внутри агрегата
SELECT
team,
count(*) as total,
count(CASE WHEN outcome = 'WIN' THEN 1 END) as wins,
count(CASE WHEN outcome = 'DRAW' THEN 1 END) as draw,
count(CASE WHEN outcome = 'LOSE' THEN 1 END) as losses,
count(CASE WHEN gametype = 'League' THEN 1 END) as leaguegames,
count(CASE WHEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) < dateTHEN 1 END) as lastmonth
FROM matches
GROUP BY team
ORDER BY total DESC
Комментарии:
1. @Konerak: нет. COUNT(NULL) игнорируется из-за отсутствия условия «ELSE»
Ответ №3:
Несколько проще и читабельнее (по крайней мере, для меня), чем использование CASE, использует ИЛИ:
SELECT
team,
count(*) as total,
count(outcome = 'WIN' OR NULL) as wins,
count(outcome = 'DRAW' OR NULL) as draw,
...
FROM matches
GROUP BY team