Skip to main content
Back to problems
#3642
Easy Database

Find books with polarized opinions

41.6% acceptance
Feb 27, 2026
48
12
Table: books +-------------+---------+ | Column Name | Type | +-------------+---------+ | book_id | int | | title | varchar | | author | varchar | | genre | varchar | | pages | int | +-------------+---------+ book_id is the unique ID for this table. Each row contains information about a book including its genre and page count. Table: reading_sessions +----------------+---------+ | Column Name | Type | +----------------+---------+ | session_id | int | | book_id | int | | reader_name | varchar | | pages_read | int | | session_rating | int | +----------------+---------+ session_id is the unique ID for this table. Each row represents a reading session where someone read a portion of a book. session_rating is on a scale of 1-5. Write a solution to find books that have polarized opinions - books that receive both very high ratings and very low ratings from different readers. A book has polarized opinions if it has at least one rating ≥ 4 and at least one rating ≤ 2 Only consider books that have at least 5 reading sessions Calculate the rating spread as (highest_rating - lowest_rating) Calculate the polarization score as the number of extreme ratings (ratings ≤ 2 or ≥ 4) divided by total sessions Only include books where polarization score ≥ 0.6 (at least 60% extreme ratings) Return the result table ordered by polarization score in descending order, then by title in descending order. The polarization score should be rounded to 2 decimal places. The result format is in the following example.

Solution

SQL
LeetCode
solution.sql
#
# Table: books
# +-------------+---------+
# | Column Name | Type    |
# +-------------+---------+
# | book_id     | int     |
# | title       | varchar |
# | author      | varchar |
# | genre       | varchar |
# | pages       | int     |
# +-------------+---------+
# book_id is the unique ID for this table.
# Each row contains information about a book including its genre and page count.
# Table: reading_sessions
# +----------------+---------+
# | Column Name    | Type    |
# +----------------+---------+
# | session_id     | int     |
# | book_id        | int     |
# | reader_name    | varchar |
# | pages_read     | int     |
# | session_rating | int     |
# +----------------+---------+
# session_id is the unique ID for this table.
# Each row represents a reading session where someone read a portion of a book. session_rating is on a scale of 1-5.
# Write a solution to find books that have polarized opinions - books that receive both very high ratings and very low ratings from different readers.
# A book has polarized opinions if it has at least one rating ≥ 4 and at least one rating ≤ 2
# Only consider books that have at least 5 reading sessions
# Calculate the rating spread as (highest_rating - lowest_rating)
# Calculate the polarization score as the number of extreme ratings (ratings ≤ 2 or ≥ 4) divided by total sessions
# Only include books where polarization score ≥ 0.6 (at least 60% extreme ratings)
# Return the result table ordered by polarization score in descending order, then by title in descending order.
# The result format is in the following example.
# Example:
# Input:
# books table:
# +---------+------------------------+---------------+----------+-------+
# | book_id | title                  | author        | genre    | pages |
# +---------+------------------------+---------------+----------+-------+
# | 1       | The Great Gatsby       | F. Scott      | Fiction  | 180   |
# | 2       | To Kill a Mockingbird  | Harper Lee    | Fiction  | 281   |
# | 3       | 1984                   | George Orwell | Dystopian| 328   |
# | 4       | Pride and Prejudice    | Jane Austen   | Romance  | 432   |
# | 5       | The Catcher in the Rye | J.D. Salinger | Fiction  | 277   |
# +---------+------------------------+---------------+----------+-------+
# reading_sessions table:
# +------------+---------+-------------+------------+----------------+
# | session_id | book_id | reader_name | pages_read | session_rating |
# +------------+---------+-------------+------------+----------------+
# | 1          | 1       | Alice       | 50         | 5              |
# | 2          | 1       | Bob         | 60         | 1              |
# | 3          | 1       | Carol       | 40         | 4              |
# | 4          | 1       | David       | 30         | 2              |
# | 5          | 1       | Emma        | 45         | 5              |
# | 6          | 2       | Frank       | 80         | 4              |
# | 7          | 2       | Grace       | 70         | 4              |
# | 8          | 2       | Henry       | 90         | 5              |
# | 9          | 2       | Ivy         | 60         | 4              |
# | 10         | 2       | Jack        | 75         | 4              |
# | 11         | 3       | Kate        | 100        | 2              |
# | 12         | 3       | Liam        | 120        | 1              |
# | 13         | 3       | Mia         | 80         | 2              |
# | 14         | 3       | Noah        | 90         | 1              |
# | 15         | 3       | Olivia      | 110        | 4              |
# | 16         | 3       | Paul        | 95         | 5              |
# | 17         | 4       | Quinn       | 150        | 3              |
# | 18         | 4       | Ruby        | 140        | 3              |
# | 19         | 5       | Sam         | 80         | 1              |
# | 20         | 5       | Tara        | 70         | 2              |
# +------------+---------+-------------+------------+----------------+
# Output:
# +---------+------------------+---------------+-----------+-------+---------------+--------------------+
# | book_id | title            | author        | genre     | pages | rating_spread | polarization_score |
# +---------+------------------+---------------+-----------+-------+---------------+--------------------+
# | 1       | The Great Gatsby | F. Scott      | Fiction   | 180   | 4             | 1.00               |
# | 3       | 1984             | George Orwell | Dystopian | 328   | 4             | 1.00               |
# +---------+------------------+---------------+-----------+-------+---------------+--------------------+
# Explanation:
# The Great Gatsby (book_id = 1):
# Has 5 reading sessions (meets minimum requirement)
# Ratings: 5, 1, 4, 2, 5
# Has ratings ≥ 4: 5, 4, 5 (3 sessions)
# Has ratings ≤ 2: 1, 2 (2 sessions)
# Rating spread: 5 - 1 = 4
# Extreme ratings (≤2 or ≥4): All 5 sessions (5, 1, 4, 2, 5)
# Polarization score: 5/5 = 1.00 (≥ 0.6, qualifies)
# 1984 (book_id = 3):
# Has 6 reading sessions (meets minimum requirement)
# Ratings: 2, 1, 2, 1, 4, 5
# Has ratings ≥ 4: 4, 5 (2 sessions)
# Has ratings ≤ 2: 2, 1, 2, 1 (4 sessions)
# Rating spread: 5 - 1 = 4
# Extreme ratings (≤2 or ≥4): All 6 sessions (2, 1, 2, 1, 4, 5)
# Polarization score: 6/6 = 1.00 (≥ 0.6, qualifies)
# Books not included:
# To Kill a Mockingbird (book_id = 2): All ratings are 4-5, no low ratings (≤2)
# Pride and Prejudice (book_id = 4): Only 2 sessions (< 5 minimum)
# The Catcher in the Rye (book_id = 5): Only 2 sessions (< 5 minimum)
# The result table is ordered by polarization score in descending order, then by book title in descending order.
#

# Write your MySQL query statement below

SELECT b.book_id, b.title, b.author, b.genre, b.pages,
  MAX(rs.session_rating) - MIN(rs.session_rating) AS rating_spread,
  ROUND(SUM(CASE WHEN rs.session_rating <= 2 OR rs.session_rating >= 4 THEN 1 ELSE 0 END) / COUNT(*), 2) AS polarization_score
FROM books b
JOIN reading_sessions rs ON b.book_id = rs.book_id
GROUP BY b.book_id, b.title, b.author, b.genre, b.pages
HAVING COUNT(*) >= 5
  AND MAX(rs.session_rating) >= 4
  AND MIN(rs.session_rating) <= 2
  AND ROUND(SUM(CASE WHEN rs.session_rating <= 2 OR rs.session_rating >= 4 THEN 1 ELSE 0 END) / COUNT(*), 2) >= 0.6
ORDER BY polarization_score DESC, b.title DESC;