Показывать "0" в столбце COUNT, когда WHERE не совпадает? - PullRequest
5 голосов
/ 18 марта 2012

То, что я хотел бы сделать, это извлечь все данные из таблицы и упорядочить их по количеству игр, в которые пользователь играл в определенной категории. Можно ли каким-то образом использовать SQL-оператор "COUNT WHERE"?

вот что у меня есть. он вернет пользователя только в том случае, если он играл в игру в категории «fps», но я хочу, чтобы он отображал всех пользователей в порядке убывания, даже если они не играли в fps. прошу прощения за мои дерьмовые столы

SELECT user_data.user, COUNT(played_games.game_cat) as 'count'
FROM user_data, played_games
WHERE user_data.user_id = played_games.user_id and played_games.game_cat = 'fps'
GROUP BY user_data.user_id
ORDER BY 'count' DESC;

таблица пользовательских данных

user_id | user

1       | jeff
2       | herb
3       | dug

таблица игровых_игр

id | user_id | game | game_cat

1  |    2    | kill | fps
2  |    1    | shoot| fps
3  |    2    | COD  | fps
4  |    3    | dogs | cas

Ответы [ 5 ]

2 голосов
/ 18 марта 2012

Вам нужно LEFT OUTER JOIN для получения записей, даже если соответствующая запись не существует в другой таблице.

SELECT user, coalesce(count(game_cat), 0) as count
FROM user_data LEFT OUTER JOIN played_games
ON user_data.user_id = played_games.user_id AND played_games.game_cat='fps'
GROUP BY user_data.user_id 
ORDER BY count desc;

Дает следующий результат на моем экране

+------+-------+
| user | count |
+------+-------+
| herb |     2 |
| jeff |     1 |
| dug  |     0 |
+------+-------+
1 голос
/ 27 апреля 2013

Объединение обещает, но не работает для меня, вздох ~ Я только что обнаружил, что NULLIF - хороший способ решить эту проблему.Не забудьте использовать LEFT JOIN

COUNT( NULLIF(TABLE.ATTR, 1) ) AS total_count

TABLE.ATTR - это поле, которое может быть NULL, вот пример:

SELECT Posts.*, COUNT( NULLIF(Comments.user_email, 1) ) as comment_num 
FROM (`Posts`)
LEFT OUTER JOIN `Comments` ON `Comments`.`post_id` = `Posts`.`id` 
GROUP BY `Posts`.`id`
LIMIT 5

Получил идею от http://www.bennadel.com/blog/579-SQL-COUNT-NULLIF-Is-Totally-Awesome.htm

1 голос
/ 18 марта 2012

Вот как я это сделаю. Нет подзапроса, нет COALESCE, нет COUNTIF мусор.

SELECT `users`.`user`, COUNT(`played_games`.id) AS `c`
FROM `users`
LEFT OUTER JOIN `played_games` ON
`users`.`user_id` = `played_games`.`user_id`
AND `played_games`.`game_cat` = "fps"
GROUP BY `users`.`user_id`
ORDER BY `c` DESC, `user` ASC

SQLFiddle (не уверен, что вы можете связать их вот так ...)

1 голос
/ 18 марта 2012

Попробуйте:

SELECT ud.user, coalesce(sum(pg.game_cat = 'fps'), 0) Total
FROM user_data ud
LEFT JOIN played_games pg ON ud.user_id = pg.user_id
GROUP BY ud.user_id
ORDER BY Total DESC

Это покажет всем пользователям и сколько раз они играли в игру с категорией 'fps'.

0 голосов
/ 18 марта 2012

Ниже запросите все игровые категории с идентификатором пользователя и упорядочите по количеству

select * from (SELECT user_data.user, COUNT(played_games.game_cat) as 'count' 
FROM user_data, played_games 
WHERE user_data.user_id = played_games.user_id(+) GROUP BY user_data.user_id)
order by count desc
...