SQLite3 — Печать книги с наименьшей стоимостью из списка пожеланий конкретного пользователя

#sql #database #sqlite #join #select

#sql #База данных #sqlite #Присоединиться #выберите

Вопрос:

Я создаю базу данных, которая отслеживает книги, пользователей и то, какие книги есть у каждого пользователя в списке желаний. Что я пытаюсь вычислить, в частности, это поиск списка желаний для конкретного пользователя по имени Джесс, а затем распечатка самых дешевых книг в списке желаний этого человека.

Запрос, который я сделал для этого прямо сейчас, выводит «Голодные игры» как самый дешевый товар в списке желаний Джесс, но проблема в том, что в списке желаний Джесс нет книги под названием «Голодные игры». Я подумал, что мой запрос, возможно, печатал товары по самым низким ценам для ВСЕХ книг в базе данных, а не для книг из списка пожеланий Джесс, но я не был уверен, почему печатается только одна книга, когда есть несколько книг, соответствующих самой низкой цене 10.00.

Запрос ДОЛЖЕН напечатать «The Fault in Our Stars» по цене 10,00, как самую дешевую книгу Джесса в его списке пожеланий, учитывая, что две другие оставшиеся книги в его списке пожеланий стоят 30,00.

Я не уверен, что не так с логикой моего запроса, и был бы признателен за некоторую помощь. Общим ключом для таблиц книг и списков пожеланий являются идентификаторы книг, поэтому я подумал, что таблицы можно объединить таким образом.

Схема:

 CREATE TABLE IF NOT EXISTS books(
      id integer NOT NULL primary key UNIQUE, 
      title text NOT NULL UNIQUE, 
      genre text NOT NULL, 
      price integer NOT NULL, 
      units_available integer NOT NULL 
      );

CREATE TABLE IF NOT EXISTS wishlist(
      owners_username integer NOT NULL,
      book_id integer NOT NULL,
      PRIMARY KEY (owners_username, book_id),
      FOREIGN KEY (owners_username) REFERENCES users (username),
      FOREIGN KEY (book_id) REFERENCES books (id)
      );
 

Данные в книгах:

 INSERT OR REPLACE INTO books VALUES(48067, 'The Maze Runner', 'Dystopian', 10.00, 20); 
INSERT OR REPLACE INTO books VALUES(5860, 'The Hunger Games', 'Dystopian', 10.00, 4); 
INSERT OR REPLACE INTO books VALUES(48070, 'The Sorcerer's Stone', 'Fantasy', 30.00, 10); 
INSERT OR REPLACE INTO books VALUES(50547, 'The Fault in Our Stars', 'Contemporary', 10.00, 235);
INSERT OR REPLACE INTO books VALUES(48400, 'Hamlet', 'Classic', 10.00, 62);
INSERT OR REPLACE INTO books VALUES(48399, 'Romeo and Juliet', 'Classic', 10.00, 102);
INSERT OR REPLACE INTO books VALUES(55620, 'Pride and Prejudice', 'Classic', 30.00, 5); 
INSERT OR REPLACE INTO books VALUES(55621, 'Oliver Twist', 'Classic', 10.00, 21); 
 

Данные для всех списков пожеланий, хранящихся в базе данных:

 INSERT OR REPLACE INTO wishlist VALUES('Bob',  48400);
INSERT OR REPLACE INTO wishlist VALUES('Jess', 55620);
INSERT OR REPLACE INTO wishlist VALUES('Jess', 50547);
INSERT OR REPLACE INTO wishlist VALUES('Jess', 48070);
 

Мой запрос:

 SELECT title, MIN(price) as lowest_price FROM books NATURAL JOIN wishlist where owners_username = 'Jess';

title             lowest_price
----------------  ------------
The Hunger Games  11
 

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

1. ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ… Не ленитесь, укажите столбцы объединения!

2. Можете ли вы также указать ожидаемый результат?

3. Ожидаемым результатом должна стать картина «Виноваты наши звезды» стоимостью 10,00. Это связано с тем, что две другие книги списка пожеланий Джесса стоят по 30,00 каждая, поэтому The Fault в наших звездах автоматически является самой дешевой книгой в его списке пожеланий.

Ответ №1:

Используйте объединение и укажите столбцы. Ваш запрос работает, как только вы его укажете.

  SELECT title, MIN(price) as lowest_price 
    FROM books JOIN wishlist on id = book_id 
    where owners_username = 'Jess';