Мне нужен запрос, который показывает все просмотры, которые:

  • еще не началось
  • Продано меньше билетов, чем доступно мест
  • Наконец, собственный столбец, показывающий количество оставшихся билетов.

Мне нужна помощь с последней частью.

Это таблицы, которые я создал:

CREATE TABLE Cinema (
  CityName VARCHAR(50) NOT NULL , 
  CinemaName VARCHAR(50) NOT NULL,
  AmountOfSeats INT(3) NOT NULL,
  CONSTRAINT UniqueCinema UNIQUE(CinemaName, CityName),
  PRIMARY KEY (CinemaName, CityName)
);
CREATE TABLE Screening(
    ScreeningID INT(3) NOT NULL,
    CinemaName VARCHAR(50) NOT NULL,
    CityName VARCHAR(50) NOT NULL,
    FilmName VARCHAR(50) NOT NULL,
    StartTime DATETIME NOT NULL,
    SoldSeats INT(3) NOT NULL,
    PRIMARY KEY(ScreeningID),
    CONSTRAINT CHECK(SoldSeats >= 0),
    FOREIGN KEY(CinemaName, Cityname) REFERENCES Cinema(CinemaName, CityName),
    FOREIGN KEY(FilmName) REFERENCES Film(FilmName)
);

А это тестовые данные:

INSERT INTO Cinema VALUES 
('Stockholm', 'Bio Rio', 150), 
('Stockholm', 'Cinemateket', 200),
('Stockholm', 'Capitol', 50),
('Uppsala', 'Fyrisbiografen', 50),
('Göteborg', 'Biopalatset', 150),
('Göteborg', 'Capitol', 50), 
('Göteborg', 'Bergakungen', 100), 
('Linköping', 'Cométen', 50),
('Jönköping', 'Fokus', 80),
('Angered', 'Biopalatset', 150);
INSERT INTO Screening VALUES 
(1, 'Capitol', 'Göteborg', 'Gudfadern', '2022-01-26 19:00:00', 30),
(2, 'Bio Rio', 'Stockholm', 'Gudfadern', '2022-01-27 19:00:00', 20),
(3, 'Bio Rio', 'Stockholm', 'Ondskan', '2022-01-29 17:00:00', 120), 
(4, 'Bio Rio', 'Stockholm', 'In the Mood for Love', '2022-01-29 13:00:00', 150), 
(5, 'Fyrisbiografen', 'Uppsala', 'Memories of Murder', '2022-01-30 19:00:00', 29), 
(6, 'Fyrisbiografen', 'Uppsala', 'Den vilda flykten', '2022-01-30 14:00:00', 19), 
(7, 'Bergakungen', 'Göteborg', 'The Death of Stalin', '2022-02-01 20:30:00', 0), 
(8, 'Fokus', 'Jönköping', 'A Bronx Tale', '2022-02-01 21:00:00', 43), 
(9, 'Biopalatset', 'Göteborg', 'Willy Wonka & the Chocolate Factory', '2022-02-13 14:00:00', 45), 
(10, 'Cinemateket', 'Stockholm', 'Monty Python and the Holy Grail', '2022-02-01 21:00:00', 50), 
(11, 'Cinemateket', 'Stockholm', 'Life of Brian', '2022-02-02 21:00:00', 50),
(12, 'Capitol', 'Stockholm', 'The Death of Stalin', '2022-02-02 19:00:00', 22),
(13, 'Cométen', 'Linköping', 'Her', '2022-02-02 14:00:00', 50),
(14, 'Cométen', 'Linköping', 'Her', '2022-02-02 18:00:00', 23),
(15, 'Biopalatset', 'Angered', 'The Rocky Horror Picture Show', '2022-02-22 19:00:00', 149),
(16, 'Capitol', 'Göteborg', 'Flight of the Navigator', '2022-02-13 13:00:00', 33),
(17, 'Capitol', 'Göteborg', 'The Great Gatsby', '2022-02-13 21:00:00', 37),
(18, 'Capitol', 'Stockholm', 'The Great Gatsby', '2022-02-13 21:00:00', 19);

Это запрос, который у меня есть до сих пор, но я все еще хочу добавить новый столбец, показывающий количество оставшихся свободных мест:

SELECT 
    Screening.FilmName, 
    Screening.CinemaName, 
    Screening.CityName, 
    Screening.StartTime 
FROM 
    Screening 
NATURAL JOIN 
    Cinema
WHERE 
    Screening.SoldSeats < Cinema.AmountOfSeats
AND 
    Screening.StartTime >= CURDATE()
ORDER BY 
    StartTime;
2
Zamkrok 26 Янв 2022 в 15:23
1
Избегайте естественных соединений, как чумы. Они подвержены ошибкам и их трудно отлаживать.
 – 
The Impaler
26 Янв 2022 в 15:24
Спасибо, у вас есть какие-либо предложения о том, какое соединение я должен использовать вместо этого в этом запросе?
 – 
Zamkrok
26 Янв 2022 в 15:27
Я думаю, вам нужен вычисляемый столбец в вашем выборе, поэтому SELECT Screening.FilmName, Screening.CinemaName, Screening.CityName, Screening.StartTime, Cinema.AmountOfSeats - Screening.SoldSeats AS seatsLeft ... а затем остальная часть оператора. Дополнительная информация: dba.stackexchange.com/questions/234244/…
 – 
Katharine Osborne
26 Янв 2022 в 15:32
СПАСИБО Кэтрин! Проблема решена :D
 – 
Zamkrok
26 Янв 2022 в 15:38

2 ответа

Add another column in your SELECT statement (AvailableSeats).
You can add for example time left too:

SELECT 
    Screening.FilmName, 
    Screening.CinemaName, 
    Screening.CityName, 
    Screening.StartTime,
    (Cinema.AmountOfSeats - Screening.SoldSeats) as AvailableSeats,
    TIMEDIFF(Screening.StartTime, CURRENT_TIMESTAMP()) as TimeLeft
FROM 
    Screening 
JOIN 
    Cinema
WHERE 
    Screening.SoldSeats < Cinema.AmountOfSeats
AND 
    Screening.StartTime >= CURDATE()
ORDER BY 
    StartTime;
    
0
miXtr 26 Янв 2022 в 15:51
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте, чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
 – 
Community
26 Янв 2022 в 16:38

Ты можешь сделать:

select s.*, c.AmountOfSeats - s.SoldSeats as tickets_left
from Screening s
join Cinema c on c.CityName = s. CityName and c.CinemaName = s.CinemaName
where StartTime > current_timestamp()
  and s.SoldSeats < c.AmountOfSeats

Результат:

 ScreeningID  CinemaName      CityName   FilmName                             StartTime            SoldSeats  tickets_left 
 ------------ --------------- ---------- ------------------------------------ -------------------- ---------- ------------ 
 1            Capitol         Göteborg   Gudfadern                            2022-01-26 19:00:00  30         20           
 2            Bio Rio         Stockholm  Gudfadern                            2022-01-27 19:00:00  20         130          
 3            Bio Rio         Stockholm  Ondskan                              2022-01-29 17:00:00  120        30           
 5            Fyrisbiografen  Uppsala    Memories of Murder                   2022-01-30 19:00:00  29         21           
 6            Fyrisbiografen  Uppsala    Den vilda flykten                    2022-01-30 14:00:00  19         31           
 7            Bergakungen     Göteborg   The Death of Stalin                  2022-02-01 20:30:00  0          100          
 8            Fokus           Jönköping  A Bronx Tale                         2022-02-01 21:00:00  43         37           
 9            Biopalatset     Göteborg   Willy Wonka & the Chocolate Factory  2022-02-13 14:00:00  45         105          
 10           Cinemateket     Stockholm  Monty Python and the Holy Grail      2022-02-01 21:00:00  50         150          
 11           Cinemateket     Stockholm  Life of Brian                        2022-02-02 21:00:00  50         150          
 12           Capitol         Stockholm  The Death of Stalin                  2022-02-02 19:00:00  22         28           
 14           Cométen         Linköping  Her                                  2022-02-02 18:00:00  23         27           
 15           Biopalatset     Angered    The Rocky Horror Picture Show        2022-02-22 19:00:00  149        1            
 16           Capitol         Göteborg   Flight of the Navigator              2022-02-13 13:00:00  33         17           
 17           Capitol         Göteborg   The Great Gatsby                     2022-02-13 21:00:00  37         13           
 18           Capitol         Stockholm  The Great Gatsby                     2022-02-13 21:00:00  19         31           

См. рабочий пример на DB Fiddle.

1
The Impaler 26 Янв 2022 в 15:36
Огромное спасибо. Интересно посмотреть, как я могу использовать обычное соединение для этого запроса.
 – 
Zamkrok
26 Янв 2022 в 15:42