MySQL верстка занимает слишком много времени, чтобы применить простой запрос

Это мой запрос,

    SELECT 
    COUNT(a.ref) AS refoct2015,
    COUNT(b.ref) AS refspet2015,
    COUNT(c.ref) AS refoct2014,
    port_ID
FROM
    report AS a
        JOIN
    report_sept2015 AS b USING (port_ID)
        JOIN
    report_oct2014 AS c USING (port_ID)
GROUP BY port_ID , a.booking_date , b.booking_date , c.booking_date

но sql занимает больше 15 минут, чтобы дать мне результат, когда он не перестает работать. Я перезагружал его много раз, менял время чтения ("Правка"> "Настройки" и т. Д.), Но все равно ничего не замедлялось

1 ответ

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

Это один метод для достижения этой цели:

SELECT A.Port_ID, A.refoct2015, B.refSept2015 , C.RefOct2014 
FROM (SELECT Port_ID, Booking_Date, count(Ref) as refoct2015 
      FROM report
      GROUP BY Port_Id, Booking_Date) A
INNER JOIN 
     (SELECT Port_ID, Booking_Date, count(Ref) as refSept2015 
      FROM Report_sept2015
      GROUP BY Port_Id, Booking_Date) B 
  ON A.Port_ID = B.Port_ID
INNER JOIN 
     (SELECT Port_ID, Booking_Date, count(Ref) as RefOct2014 
      FROM report_oct2014
      GROUP BY Port_Id, Booking_Date) C 
  ON B.Port_ID = C.Port_ID

Хотя кажется странным включать booking_date и не присоединяться к нему...

Если у меня в таблице A 100 различных дат и в таблице B 100 различных дат, а в таблице c 100 различных дат, то ваш набор результатов будет 100*100*100, при условии, что у каждого ресурса один и тот же port_Id... вероятно, почему он принимает 15 минут... Конечно, вы не пропустили соединение?

Это, кажется, имеет больше смысла для меня...

SELECT A.Port_ID, A.refoct2015, B.refSept2015 , C.RefOct2014 
FROM (SELECT Port_ID, Booking_Date, count(Ref) as refoct2015 
      FROM report
      GROUP BY Port_Id, Booking_Date) A
INNER JOIN 
     (SELECT Port_ID, Booking_Date, count(Ref) as refSept2015 
      FROM Report_sept2015
      GROUP BY Port_Id, Booking_Date) B 
  ON A.Port_ID = B.Port_ID
 and A.Booking_date= B.Booking_date
INNER JOIN 
     (SELECT Port_ID, Booking_Date, count(Ref) as RefOct2014 
      FROM report_oct2014
      GROUP BY Port_Id, Booking_Date) C 
  ON B.Port_ID = C.Port_ID
 and A.Booking_date= B.Booking_date

Однако это подразумевает, что если даты и идентификаторы портов указаны не во всех таблицах, у вас возникнут проблемы. с удалением данных из-за внутреннего соединения. Обычно я бы использовал полное внешнее соединение для решения этой проблемы, но MySQL не поддерживает его. Вы должны использовать Внешние объединения и союзы для имитации поведения.

Так что, а не продолжать угадывать, что вы после. Объясните, для чего эти таблицы и чего вы пытаетесь достичь на простом английском языке; в исходном вопросе, отредактировав его.

Боюсь, что мы попадаем в проблему XY здесь

Почему booking_date имеет значение, если его нет в списке избранных?

Похоже, что вы пытаетесь объединить данные из этих трех таблиц по дате... но затем не показывает дату....

Вы после чего-то вроде

Port_Id   Date    Oct2015  Sept2015  Oct2014
1        1/1/2015     500       250        0
1        1/2/2015     100        60        0
2        1/1/2015     100       540       60

?

Другие вопросы по тегам