2

我的数据库中有这些表:

游客 - 这是第一张桌子

    Tourist_ID - primary key
Extra_Charge_ID - foreign key

name...etc...

额外费用

    Extra_Charge_ID - primmary key 
   Excursion_ID - foreign key

    Extra_Charge_Description

Tourist_Extra_Charges

Tourist_Extra_charge_ID

Extra_Charge_ID - foreign key

Tourist_ID - foreign key

预订

Reservation_ID - primary key

.....

Tourist_Reservations

Tourist_Reservation_ID

Reservation_ID - foreign key

Tourist_ID - foreign key

所以这是我的例子: 我有Reservaton_ID- 27 的预订 这个预订有两个游客Tourist_ID- 86 和Tourist_ID- 87 这个游客 id 86 有额外的费用Extra_Charge_ID- 7 和Extra_charge_ID- 11;

是否可以进行sql查询和游客的姓名和身份证,然后是所有额外费用

所以输出可能如下所示:

Tourist_ID : 86  Name:John   Extra_Charge_ID - 7 Extra_Charge_ID - 11


Tourist_ID: 87  Name:Erika 

Extra-Charge_ID:10

(这是我为获取所有 Reservation_ID = 27 的游客的 extra_charge_description 所做的查询,但我不知道如何更改它。获取上面的名称)

Select EXTRA_CHARGES.Extra_Charge_Description,TOURIST_EXTRA_CHARGES.Tourist_ID FROM EXTRA_CHARGES

         INNER JOIN TOURIST_EXTRA_CHARGES on EXTRA_CHARGES.Extra_Charge_ID = TOURIST_EXTRA_CHARGES.Extra_Charge_ID

 INNER JOIN TOURIST_RESERVATION on TOURIST_EXTRA_CHARGES.Tourist_ID = TOURIST_RESERVATION.Tourist_ID
          INNER JOIN  RESERVATIONS on RESERVATIONS.Reservation_ID = TOURIST_RESERVATION.Reservation_ID
          where RESERVATIONS.Reservation_ID=27
4

3 回答 3

2

您的数据库架构对我来说并不完全清楚,但您似乎可以通过 Tourist_Extra_Charges 表将来自 Tourist 表的游客链接他们在EXTRA_CHARGES表中的额外费用,如下所示:

SELECT  T.Tourist_ID
        ,T.Tourist_Name
        ,EC.Extra_Charge_ID
        ,EC.Extra_Charge_Description
FROM    Tourist AS T
INNER JOIN Tourist_Extra_Charges AS TEC ON T.Tourist_ID= TEC.Tourist_ID
INNER JOIN EXTRA_CHARGES AS EC ON TEC.Extra_Charge_ID = EC.Extra_Charge_ID;

编辑

如果您希望能够过滤Reservation_ID,您还必须加入表Tourist_ReservationsReservations,如下所示:

SELECT  T.Tourist_ID
        ,T.Tourist_Name
        ,EC.Extra_Charge_ID
        ,EC.Extra_Charge_Description
FROM    Tourist AS T
INNER JOIN Tourist_Extra_Charges AS TEC ON T.Tourist_ID= TEC.Tourist_ID
INNER JOIN EXTRA_CHARGES AS EC ON TEC.Extra_Charge_ID = EC.Extra_Charge_ID
INNER JOIN Tourist_Reservations AS TR ON T.Tourist_ID = TR.Tourist_ID
INNER JOIN Reservations AS R ON TR.Reservation_ID = R.Reservation_ID
WHERE   R.Reservation_ID = 27;

至于您的数据库架构:请注意,Tourist表中不需要字段Extra_Charge_ID :您已经通过Tourist_Extra_Charges表将游客链接到额外费用。进行这种双重连接可能会危及数据的完整性。

于 2013-07-24T08:14:12.963 回答
1

您可以将它放在分隔列表中,GROUP_CONCAT如下所示:

SELECT Tourist_ID, Name, GROUP_CONCAT(Extra_Charge_ID SEPARATOR ',') 
FROM Tourist
GROUP BY Tourist_ID
于 2013-07-24T08:09:41.857 回答
0

你写:

“这个 ID 为 86 的游客有额外费用,Extra_Charge_ID - 7 和 Extra_charge_ID - 11;”

但是您的 Tourist 表确实将 Tourist_ID 作为主键,因此您将无法插入具有两个不同 Extra_Charge_ID 的 Tourist 86。

解决方案是从 Tourist 表中删除 Extra_Charge_ID。

您已经有了 Tourist_Extra_Charges,为什么不使用它呢?

Tourist
-------
86
87

Tourist_Extra_Charges
---------------
1,7,86
2,11,86

ETC

于 2013-07-24T08:10:37.850 回答