首页 > 解决方案 > select 语句中的多个内连接返回多条记录,但它应该只返回一条

问题描述

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

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

https://imgur.com/Eis5XIB

一个房间包含 A - F 排和 1 - 10 号座位,就像这张照片中一样: https ://imgur.com/aQ8y5Vr

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

https://imgur.com/waiVuMv

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

所以我想要得到的是 row_letter 和 seatnumber 以及在客户预订 ID 的帮助下的 select 语句。

我试图用这个查询来得到它。

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 的初学者。

标签: mysqldatabasejoininner-join

解决方案


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

您需要有另一个将预订与座位 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 移至座位表。


推荐阅读