我正在尝试编写一个SQL查询“查找在不同日期多次预订过一个房间的客人的预订”。
我有一个带有qazxsw点表的postgres数据库
guests
以及列出所有预订的hotel7=# SELECT * FROM guest;
guest_id | name | phone | email
----------+---------+--------------+---------------
1 | kat | 111-111-1111 | [email protected]
2 | andy | 222-222-2222 | [email protected]
3 | theda | 333-333-3333 | [email protected]
4 | forrest | 444-444-4444 | [email protected]
5 | trent | 555-555-5555 | [email protected]
6 | cyle | 666-666-6666 | [email protected]
(6 rows)
表。
reservation
还有一些其他表对问题似乎没有必要。
到目前为止,我得到的最接近的是
hotel7=# SELECT * FROM reservation;
res_id | guest_id | check_in | check_out
--------+----------+------------+------------
1 | 1 | 2017-12-01 | 2017-12-03
2 | 1 | 2017-12-05 | 2017-12-07
3 | 2 | 2017-12-01 | 2017-12-02
4 | 2 | 2017-12-01 | 2017-12-10
5 | 3 | 2017-12-01 | 2017-12-10
6 | 4 | 2017-12-15 | 2017-12-30
7 | 5 | 2017-12-15 | 2017-12-22
(7 rows)
我只需要展示列表中出现两次的人。
你可以试试这个:
hotel7=# SELECT g.name FROM guest AS g
LEFT JOIN reservation AS r
ON r.guest_id = g.guest_id;
name
---------
kat
kat
andy
andy
theda
forrest
trent
cyle
(8 rows)
对于每个SELECT A.guest_id, A.name
FROM
guest A
LEFT JOIN
reservation B
ON A.guest_id = B.guest_id
GROUP BY A.guest_id, A.name
HAVING COUNT(res_id) > 1;
,它将计算表guest_id
和res_id
条件中存在多少(非NULL)reservation
,您可以确保只获得具有多个保留的那些。
如果有像HAVING
这样的字段,您可以在查询中使用booking_date
查看预订是否由同一个人在两个不同的日期进行,但您只有登记入住和退房日期。
请试试这个
SELECT g.name FROM guest AS g LEFT JOIN预订AS r ON r.guest_id = g.guest_id,COUNT(guest_id)> 1;