2017-03-08 64 views
0

巧合。有两位同姓的客人在晚上住过酒店吗?显示姓氏和两个名字。不要包含重复项。困惑如何去查询..自己加入或通过子查询?

CLICK HERE FOR THE ER DIAGRAM

的结果应该是以下格式

+-----------+------------+-------------+ 
| last_name | first_name | first_name | 
+-----------+------------+-------------+ 
| Davies | Philip  | David T. C. | 
| Evans  | Graham  | Mr Nigel | 
| Howarth | Mr George | Sir Gerald | 
| Jones  | Susan Elan | Mr Marcus | 
| Lewis  | Clive  | Dr Julian | 
| McDonnell | John  | Dr Alasdair | 
+-----------+------------+-------------+ 
+2

如果有超过两位姓氏相同的客人,该怎么办?你有什么尝试?你有什么问题? – Ilion

+0

他们cant ..因为我给出的结果格式是实际的答案 – goonernike

+0

我试图通常加入和即时获得两个名字相同的名称.. – goonernike

回答

0

您将需要一个自联接加入表自我和DISTINCT子句来删除重复。

SELECT DISTINCT g1.last_name, g1.first_name, g2.first_name 
FROM Guests g1 
     INNER JOIN 
    Guests g2 
     ON g1.last_name = g2.last_name 
+0

noo..its显示重复值 – goonernike

1

下面正确的解决方案附:

SELECT DISTINCT c.last_name, c.first_name,d.first_name 
    FROM booking a 
     JOIN booking b ON a.booking_date <= b.booking_date AND DATE_ADD(a.booking_date, INTERVAL (a.nights -1) DAY) >= b.booking_date AND a.booking_id != b.booking_id 
     JOIN guest c ON c.id = a.guest_id 
     JOIN guest d ON d.id = b.guest_id 
    WHERE concat(a.guest_id, '_', b.guest_id) IN 
     (
     SELECT concat(a.id, '_', b.id) 
     FROM guest a 
      JOIN guest b ON a.last_name = b.last_name AND a.first_name > b.first_name 
     ) 
    ORDER BY 1 

它采用自我 - 参加两次。第一次获得包含在给定的傍晚发生的预订的所有对的表格。从所有对中,我只选择那些客人分享相同姓氏的人(这里我使用第二次自我加入)。