Несколько внутренних объединений в операторе выбора возвращают несколько записей, но должны возвращать только одну - PullRequest
0 голосов
/ 31 марта 2019

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

Я делаю сайт бронирования фильмов в кино, и для этого я создал базу данных с этими таблицами:

https://imgur.com/Eis5XIB

Одна комната содержит ряды A - F и места 1 - 10, как на этом рисунке: https://imgur.com/aQ8y5Vr

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

https://imgur.com/waiVuMv

Я сделал дополнительную страницу, на которой клиент может предоставить свой идентификатор бронирования и получить информацию о своей брони.

Поэтому я пытаюсь получить row_letter и номер места с оператором выбора с помощью идентификатора бронирования от клиента.

Я пытался получить его с помощью этого запроса.

SELECT seatnumber, row.row_letter FROM show 
INNER JOIN room ON room.idroom = show.room_idroom 
INNER JOIN row ON room.idroom = row.room_idroom 
INNER JOIN seat ON row.idrow = seat.row_idrow 
INNER JOIN reservation ON reservation.show_idshow = show.idshow 
WHERE reservation.idreservation = 11;

То, что я получаю, это: https://imgur.com/bvA86ee

То, что я ожидал, было только одной записью с номером места и row_letter.Что я делаю неправильно?Извините за то, что вы новичок в SQL.

1 Ответ

0 голосов
/ 31 марта 2019

В соответствии с таблицей бронирования на вашем первом изображении, ваши бронирования никак не связаны с местами, только с людьми.

Вам нужна другая таблица, которая связывает бронирование с идентификаторами мест.Конечно, вы можете просто добавить столбец идентификатора места в таблицу бронирования, но, очевидно, это создаст проблемы, если человек зарезервировал более 1 места.

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

После добавления таблицы зарезервированных мест, которая может быть простой:

Idreservation,
Idseat

Затем вы можете получить места для бронирования:

Select rowletter, seat_number from seats
Where idseat in (select idseat from reserved_seats where idreservation=the reservation you are checking now)

Предполагается, что вы переместили Rowletter к таблице мест.

...