MySQL Группируется по трем таблицам с минимальной функцией

#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, предположительно, для экономии времени ввода, является просто плохой формой.)