2012-05-24 2 views
0

Это работаетMySQL - Выберите с COUNT возвращения подряд NULL

SELECT DISTINCT b.b_id 
FROM    b INNER JOIN c 
ON    b.b_id=c.b_id 
WHERE   c.active='yes' AND b.featured='no' 

Когда результаты должны быть 0 возвращаемых строк, это возвращает пустую строку с Count = 0

SELECT DISTINCT b.b_id, COUNT(c.c_id) AS count 
FROM    b INNER JOIN c 
ON    b.b_id=c.b_id 
WHERE   c.active='yes' AND b.featured='no' 

Я делаю что-то неправильно?

+2

Когда вы используете функцию агрегации ('COUNT'), вам необходимо« GROUP BY »неагрегированные столбцы. MySQL не должен даже допускать этот запрос, но это приводит к непредсказуемому поведению ... – bernie

+0

ahh, ok, поэтому я удалил DISTINCT и добавленную группу GROUP by b.b_id в конце запроса. это правильно? – lewicki

ответ

2

Я думаю, что вы хотите left join вместо inner join, так как вы хотите, чтобы вернуть счетчик 0 вместо отсутствующего подряда, когда нет соответствия c записи для данного b записи.

Кроме того, вы должны включить group by при использовании агрегатной функции, такой как count.

SELECT 
    b.b_id, 
    COUNT(DISTINCT c.c_id) AS count 
FROM 
    b 
    LEFT JOIN c 
     ON b.b_id=c.b_id 
     AND c.active='yes' 
WHERE b.featured='no' 
GROUP BY b.b_id 
+1

Это правильно. – lewicki

0

Попробуйте положить DISTINCTвнутриCOUNT():

SELECT b.b_id, COUNT(DISTINCT c.c_id) AS count 
FROM b 
JOIN c ON b.b_id=c.b_id 
WHERE c.active='yes' 
AND b.featured='no' 
GROUP BY 1 

Кстати, пожалуйста, рассмотрите форматирование SQL, как это, который является более читаемым IMHO.

0

Я бы хотел попробовать GROUP BY вместо DISTINCT.

SELECT b.b_id, COUNT(c.c_id) AS count 
    FROM 
    b INNER JOIN c 
    ON 
    b.b_id=c.b_id 
    WHERE 
    c.active='yes' 
    AND 
    b.featured='no' 
    GROUP BY b.b_id 
Смежные вопросы