2010-03-30 2 views
2

Что касается следующего утверждения:Помощь с SQL Query

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 или более LPL за последние 5 лет ». До сих пор я до сих пор не дошел до счета, так как получаю огромное количество результатов с примерно 250 + на клиента.

Я предполагаю, что это связано с тем, как я соединяю столы. Схема мудрой таблицы booking_record содержит код ссылки тура, который ссылается на tour_hotel, который затем содержит код отеля, который ссылается на hotelrecord. В этой таблице для гостей отеля есть группа отелей.

Клиентский стол соединен с booking_record через ссылку на бронирование, и у клиента может быть много заказов.

Если бы кто-нибудь мог предложить мне способ сделать это, я был бы очень благодарен и, надеюсь, научился достаточно, чтобы сделать это сам в следующий раз! Я уже несколько часов царапаю голову над этим.

Клиенты могут иметь много заказов в booking_record

Даниэль.

ответ

0

В каждом туристическом отеле, возможно, есть несколько ссылок на отели. Вот почему вы получаете так много записей. Если вам не нужна какая-либо информация об отеле, вы можете просто выбрать, что вам нужно от клиента, и использовать разные.

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) 
+0

Это отлично работает! Какие-нибудь идеи, как я мог теперь подсчитать их? Я попробовал добавить «С COUNT (booking_record_.labelno)> 5» в конце, но это привело к одной строке со счетом 1,09 миллиона! –

+0

@ djfrear, вы можете попробовать объединить GROUP BY и HAVING. –

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 
+0

Спасибо Marcus - этот второй запрос сделал точно так, как я надеялся –

+0

Возможно, нет, похоже, что я все еще получаю гораздо больший подсчет, чем ожидалось, - в сотнях почти для каждой записи, некоторые из которых превышают 1000. Я бы ожидайте, что все результаты будут менее 20. –

+0

@djfrear, тогда может быть что-то происходит в соединениях. Возможно, вы захотите опубликовать свою схему для этих таблиц. –