sql запрос, на количество статей в разделе

256
24 мая 2017, 08:46

Есть такой запрос

SELECT category.name, COUNT(*) AS num_q FROM category, question WHERE question.cat_id = category.id GROUP BY category.name

Он выводит только те разделы и количество статей, в которых есть статьи, если статей нету, то категория вообще не выводится.

Как сделать так, что бы выводились все разделы и если в этом разделе пусто, то выводился 0?

Answer 1

Это делается с помощью LEFT OUTER JOIN.

Если запись для правой таблицы в частях ON или USING в LEFT OUTER JOIN не найдена, то для данной таблицы используется строка, в которой все столбцы установлены в NULL. Эту возможность можно применять для нахождения результатов в таблице, не имеющей эквивалента в другой таблице:

COUNT(q.cat_id) Показывает количество question для каждой category.

SELECT c.name, COUNT(q.cat_id) AS num_q 
  FROM category c
  LEFT OUTER JOIN question q
     on q.cat_id = c.id
GROUP BY c.name

Если вам нужно выбрать не повторяющиеся категории то сгруппируйте по их id:

Замените GROUP BY c.name на GROUP BY c.id.

Пред category и question буквы c и q называются алиасами.

Это не MySQL-специфичная фича, это элемент языка SQL. Служит для того, чтобы к таблице в пределах данного SQL-запроса можно было обращаться по другому имени. Обычно применяется:

а) в целях повышения читаемости запросов

б) в целях многократного использования одной и той же таблицы в одном запросе.

в) для именования подзапросов (в MySQL это обязательно, в отличие от других СУБД).

READ ALSO
PHP Design Patterns Workbook?

PHP Design Patterns Workbook?

Интересует "Задачник по паттернам проектирования" по типу: задача из реального проекта - варианты решения с использованием паттернов с комментариямиВстречал...

235
PHP. MySQL. Cравнение

PHP. MySQL. Cравнение

Не работает код

333
SSH не видит команду

SSH не видит команду

Всем приветПервый раз тут, потому что столкнулся действительно со сложной проблемой

648
Ошибка при отправке почты в Yii2

Ошибка при отправке почты в Yii2

Здравствуйте, возникла проблема с отправкой почты с сайта (обратная связь)

291