2012-06-10 2 views
2

Я хочу, чтобы сосчитать все строки из game_votes где g_id равно 14, она работает почти хорошо, но если нет никаких записей с g_id = 14 она до сих пор показывает 1 в поле cnt.счетчик в MySQL (*) не работает должным образом

Вот мой запрос:

SELECT 
    SUM(vote) as vote, 
    COUNT(*) as cnt 
FROM (`games`) 
LEFT JOIN `game_votes` 
ON 
    `game_votes`.`g_id` = `games`.`id` 
WHERE `games`.`id` = '14' 

Что не так? Я что-то упускаю?

ответ

2

Вы получаете счет 1, потому что COUNT (*) по существу подсчитывает количество строк в вашем результирующем наборе. Поскольку вы выбираете строку из своей таблицы игр с идентификатором 14 и оставляете ее присоединенной к таблице game_votes, у вас всегда будет 1 или более строк, если существует игра с идентификатором 14 независимо от того, независимо от того, содержит ли он какие-либо соответствующие голоса в вашей таблице games_votes. Вместо COUNT (*) попробуйте COUNT (game_votes. g_id). Если голосов нет, поле g_id будет содержать нулевое значение, а COUNT() не будет включать в расчет нулевое значение.

1
SELECT SUM(vote) as vote, COUNT(*) as cnt from games,game_votes where game_votes.g_id=games.id and games.id=14; 

Это должно работать

+0

Хорошо работает, но я рекомендую использовать синтаксис JOIN, который делает цель запроса более понятной. – RandomSeed

2

Проверьте результат

SELECT * 
FROM (`games`) 
LEFT JOIN `game_votes` 
ON 
    `game_votes`.`g_id` = `games`.`id` 
WHERE `games`.`id` = '14' 

и вы увидите, что вы используете LEFT JOIN (вместо JOIN) является причиной.

+0

Да, но я вынужден использовать 'LEFT JOIN', потому что я хочу проверить (в одном запросе), если' '' '' 'с' id = 14' действительно существует в таблице 'games', что я предполагаю делать в этом случае? – Rusco

+0

Тогда решение Zane Bien - именно то, что вы ищете. – RandomSeed

+0

Спасибо, друг :-). – Rusco

Смежные вопросы