关于以下声明:
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
内预订了很多丹尼尔。
答案 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