代码之家  ›  专栏  ›  技术社区  ›  Umut Savas

select语句中的多个内部联接返回多条记录,但它应该只返回一条

  •  0
  • Umut Savas  · 技术社区  · 6 年前

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

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

    https://imgur.com/Eis5XIB

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

    我把演出、电影、房间、人、排和座位上的记录都填好了,这样我就可以预订了。我订了几张这样的票:

    https://imgur.com/waiVuMv

    我做了一个额外的页面,客户可以提交他的预订ID,并获得有关他的预订信息。

    所以我想得到的是行字母和seatnumber,它带有一个select语句,借助于客户的预订id。

    我试着用这个查询得到它。

    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

    我所期望的是只有一张带有seatnumber和row_字母的唱片。 我做错什么了?抱歉,我是SQL初学者。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Gnudiff    6 年前

    根据您的第一张图片的预订表,您的预订不会以任何方式绑定到座位上,只绑定到人。

    你需要另一张桌子,把预订和座位号联系起来。当然,您可以将seat id列添加到reservation表中,但很明显,当一个人预订了超过1个座位时,这会产生问题。

    还要注意,虽然其他表看起来非常正确,但是对于您似乎正在对它们执行的查询来说,它们是不易处理的,这可以通过需要的大量内部连接来证明。丢失rows表并用row列代替简单地标识每个座位可能是有意义的。

    一旦您添加了一个预订座位表,它可以是简单的:

    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移到了座位桌上。