多个INNER JOIN,搜索一年范围内的记录

时间:2010-03-30 13:32:08

标签: mysql

关于以下声明:

SELECT *
  FROM explorer.booking_record booking_record_
 INNER JOIN explorer.client client_ 
    ON booking_record_.labelno = client_.labelno
 INNER JOIN explorer.tour_hotel tour_hotel_ 
    ON tour_hotel_.tourcode = booking_record_.tourrefcode
 INNER JOIN explorer.hotelrecord hotelrecord_ 
    ON tour_hotel_.hotelcode = hotelrecord_.hotelref
 WHERE booking_record_.bookingdate NOT LIKE '0000-00-00' 
   AND booking_record_.tourdeparturedate NOT LIKE '0000-00-00' 
   AND (hotelrecord_.hotelgroup = "LPL" 
   AND YEAR(booking_record_.tourdeparturedate) 
       BETWEEN YEAR(AddDate(Now(), Interval -5 Year)) 
           AND YEAR(Now())

我的MySQL技能肯定没有达到标准,我希望找到的实际结果集是“过去5年来过5家或更多LPL酒店的客户”。到目前为止,我没有处理计数,因为我得到了大量的结果,每个客户有250多个。

我认为这与我加入表格的方式有关。 Schema wise,booking_record表包含一个旅游参考代码,该代码链接到tour_hotel,然后包含一个链接到hotelrecord的酒店代码。此酒店记录表包含酒店组。

客户表通过预订参考加入booking_record,客户可能会有很多预订。

如果有人可以建议我这样做的话,我会非常感激,希望下次能够自己学会这样做!我已经在这个问题上摸不着头几个小时了!

客户可能在booking_record

内预订了很多

丹尼尔。

2 个答案:

答案 0 :(得分:0)

每个tour_hotel可能都有多个与之相关的酒店记录。这就是为什么你得到这么多的记录。如果您不需要任何有关酒店的信息,您可以从客户那里选择您需要的东西并使用distinct。

select distinct c.clientid, c.name
from explorer.booking_record b
inner join explorer.client c on b.labelno = c.labelno
inner join explorer.tour_hotel t on b.tourrefcode = t.tourcode
inner join explorer.hotelrecord h on t.hotelcode = h.hotelref
where
 b.bookingdate != '0000-00-00' and
 b.tourdeparturedate != '0000-00-00' and
 h.hotelgroup = "LPL" and 
 year(b.tourdeparturedate) >= (year(now()) - 5)

答案 1 :(得分:0)

我无法判断客户端表上的主键是什么,所以我创建了一个名为client_id的主键。

此查询将为您提供访问5个或更多不同LPL酒店及其访问过的酒店的客户列表:

SELECT c.client_id, h.hotelref FROM client c
INNER JOIN booking_record b ON b.labelno = c.labelno
INNER JOIN tour_hotel t ON t.tourcode = b.tourrefcode
INNER JOIN hotelrecord h ON h.hotelref = t.hotelcode
WHERE b.bookingdate > '0000-00-00' AND b.bookingdate IS NOT NULL AND
  b.tourdeparturedate BETWEEN DATE_ADD(NOW(), INTERVAL -5 YEAR) AND NOW() AND
  h.hotelgroup = "LPL"
GROUP BY c.client_id, h.hotelref
HAVING COUNT(c.client_id) > 4

如果您只想要客户列表,请使用DISTINCT并删除酒店列:

SELECT DISTINCT c.client_id FROM client c
INNER JOIN booking_record b ON b.labelno = c.labelno
INNER JOIN tour_hotel t ON t.tourcode = b.tourrefcode
INNER JOIN hotelrecord h ON h.hotelref = t.hotelcode
WHERE b.bookingdate > '0000-00-00' AND b.bookingdate IS NOT NULL AND
  b.tourdeparturedate BETWEEN DATE_ADD(NOW(), INTERVAL -5 YEAR) AND NOW() AND
  h.hotelgroup = "LPL"
GROUP BY c.client_id, h.hotelref
HAVING COUNT(c.client_id) > 4