如何从另一个表列中选择表?

时间:2016-05-04 16:30:36

标签: sql

我在会场有座位,但有多个场地。我可以为每个座位旁边的每个场地创建一个带有id的长桌,但这样可以制作2000个长长的场地和座位混合桌。所以我想我会为每个包含自己座位的场地创建一张桌子。如:

tickets

id | venue_name | seat_id

venueA

seat_id    | section    |    row | seat_number

所以我想从venue_name(“venueA”)和seat_id中选择场地表。如

SELECT seat_id from (select venue from tickets(venue_name));

我想要捕捉的是场地的seat_id,所以我知道正在请求哪个部分,行和座位。每个场地的部分,行和座位信息以及座位数可以不同。

我需要能够确定VenueA的座位,同时保持与VenueB的同一座位分开。

如果这是有道理的。这是我第一次尝试超越简单设计和与其他人的工作接口的sql。特别是我正在使用postgresql。

2 个答案:

答案 0 :(得分:2)

您的设计工作很糟糕,这就是您遇到此问题的原因。您应该只需要一个场地表,而不是每个场地的单独表格。然后座位表可以具有场地ID以及座位信息。类似的东西:

Venues (venue_id, venue_name, etc.)
Seats (venue_id, seat_id, section, row, seat_number)
Tickets (venue_id, seat_id, ticket_id, etc.)

而不是Tickets的“ticket_id”,您可能希望只有一个与您的事件相关的“event_id”,并且应该唯一地标识任何票证,假设您的系统没有任何奇怪的业务需求。如果适用,还要考虑非预留座位的可能性 - 机票可能实际上不适用于“座位”。这也将改变表格的架构。

如果您要进行更多此类数据库设计,那么您应该花时间阅读数据库设计和规范化。这不是一件轻而易举的事情,糟糕(或好)的数据库设计对软件开发的影响很大

答案 1 :(得分:1)

我会建议一个包含Venue,Seat,Event和Ticket等表格的模式。我会模拟Ticket,它有一个EventId和SeatId,一个Event包含一个VenueId,一个座位也会包含一个VenueId。

---编辑以包含有关测试的解释---

道歉,如果这听起来很贬义,但您可以在PostGre中使用Explain来检查查询的性能并在适当的时候进行优化。我会用虚拟数据加载数据库,可能在子表中的EventId和VenueId上有索引。 EXPLAIN的文档位于http://www.postgresql.org/docs/8.1/static/sql-explain.html