#mysql
#mysql
Вопрос:
Я искал здесь, чтобы найти ответ на мою проблему, но безрезультатно.
Я работаю над проектом, в котором задействованы 3 таблицы, 3 таблицы — это рейсы, проживание и трансферы.
Задача состоит в том, чтобы найти самую дешевую цену за месяц и за день, поэтому два отдельных запроса.
Первый запрос — найти минимальную цену в месяц, пример:
SELECT
sub_a.startdate,
ROUND((
MIN(sub_a.aprice)
MIN(sub_f.fprice)
(SELECT MIN(t.PricePP) FROM matrix.iv_transfers AS t WHERE t.PropertyID = sub_a.PropertyID AND t.Adults = sub_a.adults AND t.Airport = sub_f.arrairport AND (sub_a.startdate BETWEEN t.RangeStart AND t.RangeEnd))
2.50
)) AS TotalPP,
ROUND(
(
MIN(sub_a.aprice)
MIN(sub_f.fprice)
(SELECT MIN(t.PricePP) FROM matrix.iv_transfers AS t WHERE t.PropertyID = sub_a.PropertyID AND t.Adults = sub_a.adults AND t.Airport = sub_f.arrairport AND (sub_a.startdate BETWEEN t.RangeStart AND t.RangeEnd))
2.50
) * 1.1
) AS TotalAgtPP,
sub_f.depairport,
sub_f.arrairport,
MONTH(sub_a.startdate) AS startdatet,
DATE_FORMAT(sub_a.startdate, "%b %y") AS FormatDate,
sub_a.duration,
sub_a.PropertyID
FROM (
SELECT
a.aid,
f.fid,
a.startdate,
f.outbounddate,
MIN(a.aprice) AS aprice,
MIN(f.fprice) AS fprice
FROM matrix.iv_liveaccomm AS a
JOIN matrix.iv_liveflights AS f USING (location, duration, adults)
WHERE a.PropertyID = 22
AND a.duration = 7
AND a.adults = 2
AND a.board = 'BB'
AND f.outbounddate = a.startdate
AND f.depairport = 'LHR'
GROUP BY a.aid, f.fid, a.startdate, f.outbounddate
) AS X
JOIN matrix.iv_liveaccomm AS sub_a ON(sub_a.aid = X.aid)
JOIN matrix.iv_liveflights AS sub_f ON(sub_f.fid = X.fid)
GROUP BY MONTH(X.startdate);
Приведенный выше запрос возвращает следующий результат:
Второй запрос предназначен для получения минимальной цены в день за данный месяц.
SELECT
MONTH(sub_a.startdate) AS month_date,
ROUND((
sub_a.aprice
sub_f.fprice
(SELECT MIN(t.PricePP) FROM matrix.iv_transfers AS t WHERE t.PropertyID = sub_a.PropertyID AND t.Adults = sub_a.adults AND t.Airport = sub_f.arrairport AND (sub_a.startdate BETWEEN t.RangeStart AND t.RangeEnd))
2.50
)) AS TotalPP,
sub_f.depairport,
sub_f.arrairport,
MONTH(sub_a.startdate) AS startdatet,
DATE_FORMAT(sub_a.startdate, "%b %y") AS FormatDate,
sub_a.duration,
sub_a.PropertyID,
h.iv_PropertyReferenceID AS PropertyReferenceID,
sub_a.board,
sub_a.room,
sub_a.rating,
sub_a.`2for1`,
sub_a.`3for2`,
sub_a.`4for3`,
sub_a.`3and4`,
sub_a.freebb,
sub_a.adults,
sub_a.children,
sub_a.nss,
CONCAT("/search/results?tkn=",DATE_FORMAT(sub_a.startdate,"%d-%m-%Y"),"|",sub_a.duration,"|","A:",da.iv_AirportID,"|A:",aa.iv_AirportID,",R:",des.iv_RegionID,"|",r.iv_ResortID,"|",h.iv_PropertyReferenceID,"|",m.iv_MealBasisID,"|",sub_a.rating,"|1|",sub_a.adults,sub_a.children,",0|0,0,0|0,0,0|LPP|",sub_a.PropertyID) AS DeepLink
FROM (
SELECT
a.aid,
f.fid,
a.startdate,
f.outbounddate,
MIN(a.aprice) AS aprice,
MIN(f.fprice) AS fprice
FROM matrix.iv_liveaccomm AS a
JOIN matrix.iv_liveflights AS f USING (location, duration, adults)
WHERE a.PropertyID = 22
AND a.duration = 7
AND a.startdatet = 6
AND a.adults = 2
AND a.board = 'BB'
AND f.outbounddate = a.startdate
AND f.depairport = 'LHR'
GROUP BY a.aid, f.fid, a.startdate, f.outbounddate
) AS X
JOIN matrix.iv_liveaccomm AS sub_a ON(sub_a.aid = X.aid)
JOIN matrix.iv_liveflights AS sub_f ON(sub_f.fid = X.fid)
JOIN global.hotels AS h ON(h.iv_PropertyID = sub_a.PropertyID)
JOIN global.resorts AS r ON (r.iv_ResortID=h.iv_ResortID)
JOIN global.destinations AS des ON (des.iv_RegionID=r.iv_RegionID)
JOIN global.airports AS da ON (da.airportcode=sub_f.depairport)
JOIN global.mealbasis AS m ON (m.MealBasisCode=sub_a.board)
JOIN global.airports AS aa ON (aa.airportcode=sub_f.arrairport)
GROUP BY X.startdate;
и выдает следующий результат:
Как вы можете видеть из первого скриншота, минимальная цена в июне составляет 383, но на 2-м скриншоте минимальная цена равна 386.
Почему цена отличается от группировки по месяцам и датам?
Спасибо
Комментарии:
1. В чем ваш вопрос?
2. Почему цена отличается от группировки по месяцам и датам?
3. Вы думали об использовании представления для этого? Это значительно упростило бы чтение вашего кода.
4. Кроме того, какие таблицы в вашем втором запросе находятся в
global
схеме? Вы не упоминаете их в своем вопросе.5. Ваш второй запрос содержит дополнительное условие where и внутренние соединения с шестью дополнительными таблицами; они не агрегируют одни и те же данные двумя разными способами. Они агрегируют разные данные разными способами. (Примечание: разделение ваших условий объединения таким образом, чтобы три были в USING, а одно — в WHERE, предположительно, для экономии времени ввода, является просто плохой формой.)