Книжный магазин SQLite: последние студенты и все книги, которые они заказали

#sql #sqlite #join #common-table-expression

#sql #sqlite #Присоединиться #common-table-expression

Вопрос:

Форум. Я пытаюсь запустить SQL для своего местного книжного магазина. Проблема в том, чтобы показать последних N учеников и все книги, которые они заказали.

Моя попытка:

 CREATE TABLE books (
   id INTEGER,
   name TEXT,
   genre TEXT,
   pages INTEGER,
   price INTEGER
);
INSERT INTO books (id, name, genre, pages, price)
VALUES
(1, name_1, genre_1, 100, 10),
(2, name_2, genre_2, 200, 20),
(3, name_3, genre_3, 300, 30); 
--etc rows here

CREATE TABLE orders (
   id INTEGER,
   name TEXT,
   id_book INTEGER,
   date INTEGER --in SQLite INTEGER for a date is okay
);
INSERT INTO orders (id, name, id_book, date)
VALUES
(1, name_1, id_book_1, date_1),
(2, name_2, id_book_2, date_2),
(3, name_3, id_book_3, date_3); 
--etc rows here

WITH last_students AS(
SELECT orders.name
FROM orders
ORDER BY orders.id DESC
LIMIT 3) --creates temp table with last 3 names of students
SELECT orders.name, books.name
FROM books
INNER JOIN last_students
    ON books.id = last_students.id_book;
 

Это нормальный код? Проверка синтаксиса показывает ошибку только в строке 8, которую я не понимаю. Заранее благодарю вас

Ответ №1:

Вы можете присоединиться books orders и отфильтровать результаты для последних N студентов:

 WITH last_students AS (
  SELECT DISTINCT name
  FROM orders
  ORDER BY date DESC LIMIT 3
) 
SELECT o.name AS student_name, 
       b.name AS book_title
FROM books b INNER JOIN orders o
ON o.id_book = b.id
WHERE o.name IN last_students
 

CTE возвращает последних 3 студентов (по дате, а не по идентификатору), которые заказали книгу.

Посмотрите демонстрацию.