Запрос с подзапросами - 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;

Объяснение кода листинга программы

  1. Запрос выбирает два подзапроса:
    • Первый подзапрос считает количество оценок со значением 0.
    • Второй подзапрос считает количество оценок со значением 1.
  2. Результатом запроса являются два столбца:
    • reviews_id - идентификатор отзыва.
    • кол-во оценок со значение 0 - количество оценок со значением 0.
    • кол-во оценок со значение 1 - количество оценок со значением 1.
  3. Оба подзапроса используют таблицу ocenka_reviews для подсчета оценок.
  4. В обоих подзапросах используется условие o.reviews_id=r.reviews_id, которое связывает данные из таблицы reviews с данными из таблицы ocenka_reviews.
  5. Первый подзапрос использует условие rev_ocenka=0, чтобы выбрать только оценки со значением 0.
  6. Второй подзапрос использует условие rev_ocenka=1, чтобы выбрать только оценки со значением 1.
  7. Оба подзапроса используют функцию count(*), чтобы подсчитать количество выбранных оценок.
  8. Результат обоих подзапросов выводится в итоговом запросе.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5