【问题标题】:Basic SQL query基本 SQL 查询
【发布时间】:2014-08-07 10:18:47
【问题描述】:

很抱歉这个查询的基础性,但我需要一些帮助在这里学习:)

这是一个酒店的数据库。

这是我的桌子:

  • 酒店(hotelNo,hotelName,城市)
  • 房间(roomNohotelNo、类型、价格)
  • 预订(hotelNoguestNodateFrom、dateTo、roomNo)
  • 来宾(guestNo、guestName、guestAddress)

粗体字是主键。我意识到为 Bookings 使用串联主键并不是最好的设计,但这里就是这样。

我需要查询以下内容:

8 月份有多少不同的客人进行了预订?

【问题讨论】:

  • 到目前为止,您尝试了哪些查询(如果有)?看起来你没有尝试过任何东西?
  • 不要介意复合主键.. 但是不要介意“ID”和“否”的不一致使用,尤其是在酒店和房间。
  • 那是我的错误,Arth。他们都是No。出于习惯,我在前几个上使用了ID。 @TheChaos,我不知道如何使用连接......所以我从一开始就被难住了......如果我能让两张表正确连接,我就可以做到
  • 嗯好的,只要现在一致,请更新问题。
  • 无论酒店/房间如何,您只需要总客人数,还是只需要计数还是客人的详细信息?

标签: mysql sql


【解决方案1】:
SELECT COUNT (DISTINCT guestno)
FROM   booking
WHERE  MONTH(datefrom) = 8

【讨论】:

  • 这将包括任何年份,并且不包括在八月结束但在八月之前开始的预订,或者整个八月。
  • 这似乎是最简单最简单的!干杯队友
  • @Arth:对不起,我应该指定更多。我只需要 八月的预订,如 dateFrom August。
  • @LukeBeacon 没问题,我的工作是“只需要统计 8 月份所有酒店的独特客人数”。我会留下我的答案,以防万一您需要该逻辑一点。
【解决方案2】:

计算 7 月份的客人人数。

然后在 8 月份做同样的事情。

在这两个值之间做差,并得到八月份预订的新客人的数量。

不是一个很好的形状,但它是一个你可以开始的选择。

【讨论】:

  • 什么?为什么还要考虑 7 月的预订……我认为他的意思是不同的客人。
【解决方案3】:

这样试试

select guestName, guestAddress from Booking b 
inner join Guest g on b.guestNo=g.guestNo
inner join Hotel h on b.hotelNo=h.hotelID 
inner join Room r on b.roomNo=r.roomID
where b.hotelID=h.hotelID and 
MONTHNAME(dateFrom) = 'August' 
and MONTHNAME(dateTo)='August'

【讨论】:

    【解决方案4】:

    您实际上并不需要 JOIN:

    SELECT COUNT(DISTINCT guestNo)
      FROM booking
     WHERE dateTo >= CONCAT(YEAR(CURDATE()),'-08');
       AND dateFrom < CONCAT(YEAR(CURDATE()),'-09');
    

    这将包括完全覆盖 8 月的预订,或者在 8 月开始或结束的预订......我认为其他答案不包括。

    我还假设您只想要今年的这个。

    【讨论】:

      【解决方案5】:

      下面的查询应该适合你,

      SELECT 
             Booking.*,
             Guest.*
      FROM   Guest
             JOIN Booking 
                    ON Guest.guestNo = Booking
             LEFT JOIN Room 
                    ON Booking.roomNo = Room.roomID
             LEFT JOIN Hotel 
                    ON Room.hotelID = Hotel.hotelID
      WHERE
             MONTH(datefrom) = '8'
      

      还有一个关于预订表复合键的建议。 Booking表的复合键应该是guestNo, roomNo, hotelNo, dateFrom

      【讨论】:

        猜你喜欢
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        • 1970-01-01
        • 2015-12-11
        相关资源
        最近更新 更多