Обновить общее количество книг, исключая просроченные

#mysql

#mysql

Вопрос:

Я борюсь со следующим запросом, который обновляет total_books для каждой категории

 UPDATE book_categories C, books P, (SELECT cat_id, book_id, COUNT(*) AS TOTAL_BOOKS FROM book_category GROUP BY cat_id) PC SET C.total_books=PC.TOTAL_BOOKS WHERE PC.cat_id=C.cat_id AND P.book_id=PC.book_id AND P.is_expired=false
  

Проблема с этим запросом в том, что он не пропускает книги с истекшим сроком действия. Мне нужна подсказка, как пропустить книги с истекшим сроком действия.

Вот схема:

 Create table books (
    book_id Bigint UNSIGNED NOT NULL AUTO_INCREMENT,
is_expired Bit(1) NOT NULL DEFAULT false,
Primary Key ( book_id)) ENGINE = InnoDB;

Create table book_categories (
    cat_id Int UNSIGNED NOT NULL AUTO_INCREMENT,
    total_books Int UNSIGNED NOT NULL DEFAULT 0,
Primary Key (cat_id)) ENGINE = InnoDB;

Create table book_category (
     book_category_id Int UNSIGNED NOT NULL AUTO_INCREMENT,
    cat_id Int UNSIGNED NOT NULL,
     book_id Bigint UNSIGNED NOT NULL,
Primary Key ( book_category_id)) ENGINE = InnoDB;

Alter table book_category add Foreign Key (book_id) references books (book_id) on delete  restrict on update  restrict;
Alter table book_category add Foreign Key (cat_id) references book_categories (cat_id) on delete  restrict on update  restrict;
  

Комментарии:

1. Я взял на себя смелость форматировать ваш пост. Пожалуйста, позаботьтесь об этом в следующий раз; 11 месяцев и 32 вопроса должно быть достаточно, чтобы выучить синтаксис Markdown!

2. Спасибо Tomalak, я добавил пробелы, но некоторые из них появились только в первом абзаце.

Ответ №1:

внутренний запрос должен выглядеть следующим образом:

 (SELECT cat_id, book_id, COUNT(*) AS TOTAL_BOOKS 
FROM book_category bc
JOIN books b 
ON bc.book_id = b.book_id
WHERE b.is_expired ='false'
GROUP BY cat_id)
  

Комментарии:

1. есть одна проблема, внутренний запрос ничего не возвращает, если нет книг с истекшим сроком действия, как я могу заставить его вернуть 0, если совпадений нет?

2. взгляните на mysql COALESCE ‘ =)