【问题标题】:Multiple inner joins in select statement return multiple records, but it should return only one选择语句中的多个内连接返回多条记录,但它应该只返回一条
【发布时间】:2019-03-30 21:44:02
【问题描述】:

我的 select 语句返回了很多记录,但它应该只返回一个。我使用了很多内部连接,但我做错了。

我正在制作一个电影院电影预订网站,为此我创建了一个包含以下表格的数据库:

https://imgur.com/Eis5XIB

一个房间包含 A - F 排和 1 - 10 个座位,如下图所示: https://imgur.com/aQ8y5Vr

我用记录填满了表格、电影、房间、人、行和座位,这样我就可以预订了。我做了一些预订,看起来像这样:

https://imgur.com/waiVuMv

我制作了一个额外的页面,客户可以在其中提交他的预订 ID 并获取有关他的预订的信息。

所以我想在客户的预订 ID 的帮助下获得带有 select 语句的 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 初学者。

【问题讨论】:

标签: mysql database join inner-join


【解决方案1】:

根据您的第一张图片的预订表,您的预订与座位无关,仅与人相关。

您需要另一个将预订与座位 ID 相关联的表。当然,您可以只在预订表中添加座位 id 列,但这显然会在一个人预订超过 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 移至座位表。

【讨论】:

  • 如果我理解你的正确,这将是解决方案:imgur.com/cJVPVQM
  • @UmutSavas 不完全正确。座位是不可变的,它们描述了您在每个房间中的实际椅子。 Reservations 和 reserved_seats 只是说这个节目这个座位已经被占用了。我添加了一些描述。
  • 好的,我按照你说的改了。 imgur.com/X2oXLw0 我不需要表reserved_seats 中的主键是对的吗?抱歉问了这么多问题。我只是想明白。
  • @UmutSavas 是的,你不需要主键
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多