Запрос с подзапросами - MySQL
Формулировка задачи:
Здравствуйте, имеются две таблицы: рецензии и оценки к ним. Оценки могут иметь значение только 1 и 0 (условные "Да" и "Нет"). Пытаюсь составить запрос, который бы выводил поля из таблицы рецензии и количество оценок со значениями 1 и 0, на основе которых бы вычислялся рейтинг рецензии. Делаю так, потому что не хочу переписывать уже имеющейся код.
Мой запрос работает некорректно: вместо вывода нужных значений он во все поля вставляет единицы. Вот как он выглядит:
Также привожу схему этих двух таблиц.
SELECT reviews.reviews_id, DATE_FORMAT(date_review, '%H:%i | %d.%m.%Y'), message, login, plus, minus, mov_ocenka, (SELECT IFNULL(COUNT(rev_ocenka), 0)
FROM ocenka_reviews LEFT JOIN reviews
ON reviews.reviews_id=ocenka_reviews.reviews_id AND rev_ocenka=1
GROUP BY ocenka_reviews.reviews_id
LIMIT 1),
(SELECT IFNULL(COUNT(rev_ocenka), 0)
FROM ocenka_reviews LEFT JOIN reviews
ON reviews.reviews_id=ocenka_reviews.reviews_id AND rev_ocenka=0
GROUP BY ocenka_reviews.reviews_id
LIMIT 1)
FROM users, reviews
WHERE movies_id=1 AND reviews.user_id=users.user_id ORDER BY reviews_idРешение задачи: «Запрос с подзапросами»
textual
Листинг программы
select r.reviews_id, (select count(*) from ocenka_reviews o where o.reviews_id=r.reviews_id and rev_ocenka=0) `кол-во оценок со значение 0`, (select count(*) from ocenka_reviews o where o.reviews_id=r.reviews_id and rev_ocenka=1) `кол-во оценок со значение 1` from reviews r;
Объяснение кода листинга программы
- Запрос выбирает два подзапроса:
- Первый подзапрос считает количество оценок со значением 0.
- Второй подзапрос считает количество оценок со значением 1.
- Результатом запроса являются два столбца:
reviews_id- идентификатор отзыва.кол-во оценок со значение 0- количество оценок со значением 0.кол-во оценок со значение 1- количество оценок со значением 1.
- Оба подзапроса используют таблицу
ocenka_reviewsдля подсчета оценок. - В обоих подзапросах используется условие
o.reviews_id=r.reviews_id, которое связывает данные из таблицыreviewsс данными из таблицыocenka_reviews. - Первый подзапрос использует условие
rev_ocenka=0, чтобы выбрать только оценки со значением 0. - Второй подзапрос использует условие
rev_ocenka=1, чтобы выбрать только оценки со значением 1. - Оба подзапроса используют функцию
count(*), чтобы подсчитать количество выбранных оценок. - Результат обоих подзапросов выводится в итоговом запросе.